using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.IO.Ports;
|
using System.Windows.Forms;
|
using System.Net;
|
using System.Net.Sockets;
|
|
namespace WCS
|
{
|
/// <summary>
|
/// 磅秤TCP通讯线程
|
/// </summary>
|
class ScaleTcpThread
|
{
|
SerialPort sp;
|
#region 画面上同步显示控件
|
public ListBox scaledisplay;
|
#endregion
|
Thread trd = null;
|
delegate void displayresponse(string text);
|
int scaleno = 0, portno = 0;
|
private string scaleIp;
|
//int sum = 0;
|
|
private IPEndPoint ServerInfo;
|
private Socket socket;
|
private Byte[] MsgBuffer;
|
private Byte[] MsgSend;
|
|
main form1;
|
bool threadFlag = true, spFlag = true;
|
|
public ScaleTcpThread(int scale_no, string scale_ip, int port, main m)
|
{
|
this.scaleno = scale_no;
|
this.scaleIp = scale_ip;
|
this.portno = port;
|
this.form1 = m;
|
|
MsgBuffer = new Byte[65535];
|
MsgSend = new Byte[65535];
|
//sp = new SerialPort();
|
//sp.PortName = "COM" + port.ToString();
|
//sp.BaudRate = 9600;
|
//sp.DataBits = 8;
|
//sp.Parity = Parity.None;
|
//sp.StopBits = StopBits.One;
|
|
//if (sp.IsOpen) return;
|
//try
|
//{
|
// sp.Open();
|
//}
|
//catch (Exception r)
|
//{
|
// spFlag = false;
|
// //DisplayInfo("【" + DateTime.Now.ToString() + "】打开串口" + portno + "失败,请检查");
|
// //return;
|
//}
|
trd = new Thread(new ThreadStart(this.ThreadTask));
|
trd.IsBackground = true;
|
trd.Start();
|
}
|
|
#region socket连接
|
/// <summary>
|
/// socket连接WMS服务器
|
/// </summary>
|
private void SocketConnect()
|
{
|
ServerInfo = new IPEndPoint(IPAddress.Parse(scaleIp), portno);
|
try
|
{
|
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
socket.Connect(ServerInfo);
|
//Int32 bytes = socket.Receive(MsgBuffer, MsgBuffer.Length, SocketFlags.None);
|
//StringBuilder buff = new StringBuilder();
|
//String receiveData = Encoding.UTF8.GetString(MsgBuffer, 0, bytes);
|
//socket.Send(Encoding.Unicode.GetBytes("socket connect!"));
|
//RecevieData = "s";
|
//socket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
|
|
DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接成功");
|
|
}
|
catch (Exception em)
|
{
|
DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接失败!" + em.Message);
|
}
|
}
|
|
/// <summary>
|
/// socket重新连接WMS服务器
|
/// </summary>
|
private void SocketReConnect()
|
{
|
if (socket.Connected)
|
{
|
socket.Close();
|
}
|
Thread.Sleep(10000);
|
SocketConnect();
|
}
|
|
/// <summary>
|
/// 判断socket是否已连接
|
/// </summary>
|
/// <returns></returns>
|
private bool checkSocket()
|
{
|
bool ret = true;
|
bool isConnected = false;
|
bool isRead = false;
|
bool isWrite = false;
|
bool isError = false;
|
int avalSize = 0;
|
try
|
{
|
isConnected = socket.Connected;
|
isRead = socket.Poll(50, SelectMode.SelectRead);
|
avalSize = socket.Available;
|
isWrite = socket.Poll(50, SelectMode.SelectWrite);
|
isError = socket.Poll(50, SelectMode.SelectError);
|
if (isConnected == false || isError == true || (isRead == true && avalSize == 0))
|
{
|
ret = false;
|
}
|
}
|
catch (Exception e)
|
{
|
ret = false;
|
}
|
return ret;
|
}
|
#endregion
|
|
/// <summary>
|
/// 获取磅秤称重重量并解析
|
/// </summary>
|
private void GetScaleData()
|
{
|
//string s_SendString = "", s_RecStr = "", s_wt = "", s_part1 = "", s_part2 = "", s_part3 = "", s_part4 = "", s_part5 = "", s_part6 = "", s_part7 = "", s_imp = "";
|
//int pos = 0, pos1 = 0, pos2 = 0;
|
string dataValue = "P", s_RecStr = "";
|
double d_RecStr = 0;
|
try
|
{
|
if (checkSocket() == false)
|
{
|
//调用重连
|
Common.gd_gross_wt[scaleno - 1] = 0;
|
DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接已断开,重连...");
|
SocketReConnect();
|
return;
|
}
|
|
MsgSend = Encoding.UTF8.GetBytes(dataValue);
|
if (socket.Connected)
|
{
|
// 向主机发送数据.
|
socket.Send(MsgSend, MsgSend.Length, SocketFlags.None);
|
//socket.Send(MsgSend);
|
//DisplayInfo("发送信息:" + dataValue);
|
//RecevieData = "";
|
// 接收主机应答
|
Int32 bytes = socket.Receive(MsgBuffer, MsgBuffer.Length, SocketFlags.None);
|
StringBuilder buff = new StringBuilder();
|
if (bytes > 0)
|
{
|
// 将缓冲的字节数组,装换为字符串.
|
// String receiveData = Encoding.ASCII.GetString(MsgBuffer, 0, bytes);
|
s_RecStr = Encoding.ASCII.GetString(MsgBuffer, 0, bytes);
|
if (s_RecStr.Length < 16)
|
{
|
Common.gd_gross_wt[scaleno - 1] = 0;
|
DisplayInfo("【" + DateTime.Now.ToString() + "】无称重数据或者数据异常");
|
return;
|
}
|
s_RecStr = s_RecStr.Substring(1, 7);
|
//for (int i = 0; i < s_RecStr.Length; i++)
|
//{
|
// string s_nPos = s_RecStr.Substring(i, 1);
|
// if (Common.ChkStrtoInt(s_nPos) && i != 5)
|
// {
|
// s_wt_Str += s_nPos;
|
// }
|
// else if (i == 5)
|
// {
|
// if (s_nPos == ".")
|
// {
|
// s_wt_Str += s_nPos;
|
// }
|
// else
|
// {
|
// Common.gd_gross_wt[scaleno - 1] = 0;
|
// DisplayInfo("【" + DateTime.Now.ToString() + "】无称重数据或者数据异常");
|
// return;
|
// }
|
// }
|
//}
|
try
|
{
|
d_RecStr = Convert.ToDouble(s_RecStr);
|
Common.gd_gross_wt[scaleno - 1] = d_RecStr;
|
DisplayInfo("【" + DateTime.Now.ToString() + "】" + Common.gd_gross_wt[scaleno - 1] + " KG");
|
}
|
catch
|
{
|
return;
|
}
|
//DisplayInfo("收到消息:" + receiveData);
|
// AnalysisReceive(receiveData); //解析收到的数据
|
// 加入字符串缓存
|
//buff.Append(str);
|
// 再次接受,看看后面还有没有数据.
|
}
|
}
|
else
|
{
|
Common.gd_gross_wt[scaleno - 1] = 0;
|
DisplayInfo("【" + DateTime.Now.ToString() + "】磅秤连接已断开,无法读取数据!");
|
}
|
return;
|
}
|
catch (Exception t)
|
{
|
Common.gd_gross_wt[scaleno - 1] = 0;
|
DisplayInfo("【" + DateTime.Now.ToString() + "】得到磅秤重量失败:" + t.Message);
|
//DisplayInfo("未能得到磅称重量,请检查!---时间:" + System.DateTime.Now.ToString());
|
//Thread.Sleep(400);
|
return;
|
}
|
|
}
|
|
#region 通讯反馈同步显示
|
private void DisplayInfo(string text)
|
{
|
if (scaledisplay.InvokeRequired)
|
{
|
try
|
{
|
displayresponse d = new displayresponse(DisplayInfo);
|
scaledisplay.Invoke(d, new object[] { text });
|
}
|
catch (Exception r)
|
{
|
|
}
|
}
|
else
|
{
|
if (scaledisplay.Items.Count > 12)
|
{
|
scaledisplay.Items.Clear();
|
}
|
scaledisplay.Items.Add(text);
|
}
|
|
}
|
#endregion
|
|
private void ThreadTask()
|
{
|
SocketConnect();
|
while (threadFlag)
|
{
|
//if (spFlag)
|
//{
|
GetScaleData();
|
//}
|
//else
|
//{
|
// DisplayInfo("【" + DateTime.Now.ToString() + "】打开串口" + portno + "失败,请检查");
|
// threadFlag = false;
|
//}
|
Thread.Sleep(400);
|
|
}
|
}
|
}
|
}
|