483 lines
16 KiB
C#
483 lines
16 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Net.Sockets;
|
||
using System.Runtime.ConstrainedExecution;
|
||
using System.Text;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
|
||
namespace DK_DC_Tool
|
||
{
|
||
public class Tighten
|
||
{
|
||
public static Dictionary<string, string> TightenNG_Code = new Dictionary<string, string>()
|
||
{
|
||
// 00 = 无定意;01 = 最终扭矩过大;02 = 最终扭矩过大;03 = 最终角度过大;04 = 最终角度过小;n1 = 第 n 步扭矩过大;n2 = 第 n 步时间超限;1 < n < 5;90 = 总时间超限;
|
||
{ "00", "无定意" },
|
||
{ "01", "最终扭矩过大" },
|
||
{ "02", "最终扭矩过大" },
|
||
{ "03", "最终角度过大" },
|
||
{ "04", "最终角度过小" },
|
||
{ "11", "第 1 步扭矩过大" },
|
||
{ "21", "第 2 步扭矩过大" },
|
||
{ "31", "第 3 步扭矩过大" },
|
||
{ "41", "第 4 步扭矩过大" },
|
||
{ "51", "第 5 步扭矩过大" },
|
||
{ "12", "第 1 步时间超限" },
|
||
{ "22", "第 2 步时间超限" },
|
||
{ "32", "第 3 步时间超限" },
|
||
{ "42", "第 4 步时间超限" },
|
||
{ "52", "第 5 步时间超限" },
|
||
{ "90", "总时间超限" }
|
||
};
|
||
|
||
TcpClient _client = null;
|
||
Thread _parse_tid = null;
|
||
Thread _tightenHeartBeat = null;
|
||
bool _isconnected = false;
|
||
bool _is_run = false;
|
||
bool _is_reconnect = true;
|
||
bool _first_connect = true;
|
||
string ip = "127.0.0.1";
|
||
int port = 5000;
|
||
int _reconnect_cnt = 0;
|
||
string currentOpName = "127.0.0.1";
|
||
public static Action<String,String> E_ScanContent = null;
|
||
public static Action<String, String, String> E_LogInsert = null;
|
||
public static Action<String> E_DeviceHeartBeat = null;
|
||
|
||
|
||
public void Start(string ip ,int port, string opName)
|
||
{
|
||
this.currentOpName = opName;
|
||
this.ip = ip;
|
||
this.port = port;
|
||
|
||
_parse_tid = new Thread(new ThreadStart(parse_entry));
|
||
_parse_tid.Name = "data_parse";
|
||
_parse_tid.IsBackground = true;
|
||
_parse_tid.Start();
|
||
_tightenHeartBeat = new Thread(new ThreadStart(hw_send_HeartBeat));
|
||
_tightenHeartBeat.Name = "tightenHeartBeat";
|
||
_tightenHeartBeat.IsBackground = true;
|
||
_tightenHeartBeat.Start();
|
||
|
||
|
||
_is_run = true;
|
||
_is_reconnect = true;
|
||
_first_connect = true;
|
||
_reconnect_cnt = 0;
|
||
|
||
}
|
||
public void Stop()
|
||
{
|
||
_is_run = false;
|
||
_is_reconnect = false;
|
||
_first_connect = false;
|
||
}
|
||
|
||
//代理
|
||
private delegate void change_tbx_delegate(string str);
|
||
|
||
private string bytes_to_hex_string(byte[] buf, int offset, int len)
|
||
{
|
||
string str = "";
|
||
|
||
for (int i = 0; i < len; i++)
|
||
{
|
||
str += buf[offset + i].ToString("X2") + " ";
|
||
}
|
||
|
||
return str;
|
||
}
|
||
|
||
private string bytes_to_string(byte[] buf, int offset, int len)
|
||
{
|
||
string str = "";
|
||
|
||
for (int i = 0; i < len; i++)
|
||
{
|
||
if ((buf[offset + i] < 32) || (buf[offset + i] > 126))
|
||
str += " .";
|
||
else
|
||
str += " " + ((char)buf[offset + i]).ToString();
|
||
|
||
str += " ";
|
||
}
|
||
|
||
return str;
|
||
}
|
||
private bool tcp_connect(ref TcpClient client, string ip, string port)
|
||
{
|
||
if (!_is_run)
|
||
return false;
|
||
|
||
try
|
||
{
|
||
if (client != null)
|
||
client.Close();
|
||
client = null;
|
||
|
||
client = new TcpClient();
|
||
if (!client.ConnectAsync(ip, int.Parse(port)).Wait(2000))
|
||
{
|
||
client.Close();
|
||
client = null;
|
||
|
||
return false;
|
||
}
|
||
}
|
||
catch(Exception err)
|
||
{
|
||
E_LogInsert("Tighten", "Error", "165:" + err.Message);
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("0");
|
||
}
|
||
client = null;
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
private int tcp_receive(TcpClient client, byte[] buffer, int offset, int max_len)
|
||
{
|
||
if (!_is_run)
|
||
return (int)RETURN_ERR_STATE.RETURN_ESTOP;
|
||
|
||
if (!_isconnected)
|
||
return (int)RETURN_ERR_STATE.RETURN_ECONNECT;
|
||
|
||
if (client == null)
|
||
return (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
|
||
if (client.Connected == false)
|
||
return (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
|
||
NetworkStream networkStream = null;
|
||
|
||
try
|
||
{
|
||
networkStream = client.GetStream();
|
||
}
|
||
catch
|
||
{
|
||
return (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
}
|
||
|
||
int len = 0;
|
||
int rc = 0;
|
||
|
||
while (max_len > 0)
|
||
{
|
||
Thread.Sleep(20);
|
||
|
||
if (!_is_run)
|
||
{
|
||
rc = (int)RETURN_ERR_STATE.RETURN_ESTOP;
|
||
break;
|
||
}
|
||
|
||
if (!_isconnected)
|
||
{
|
||
rc = (int)RETURN_ERR_STATE.RETURN_ECONNECT;
|
||
break;
|
||
}
|
||
|
||
try
|
||
{
|
||
if (networkStream.DataAvailable == false)
|
||
break;
|
||
|
||
rc = networkStream.Read(buffer, offset + len, max_len);
|
||
if (rc <= 0)
|
||
{
|
||
rc = (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
break;
|
||
}
|
||
|
||
len += rc;
|
||
max_len -= rc;
|
||
}
|
||
catch
|
||
{
|
||
rc = (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (rc >= 0)
|
||
rc = len;
|
||
|
||
return rc;
|
||
}
|
||
|
||
private int tcp_send(TcpClient client, byte[] buffer)
|
||
{
|
||
if (!_is_run)
|
||
return (int)RETURN_ERR_STATE.RETURN_ESTOP;
|
||
|
||
if (!_isconnected)
|
||
return (int)RETURN_ERR_STATE.RETURN_ECONNECT;
|
||
|
||
if (client == null)
|
||
return (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
|
||
if (client.Connected == false)
|
||
return (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
|
||
try
|
||
{
|
||
NetworkStream networkStream = _client.GetStream();
|
||
networkStream.Write(buffer, 0, buffer.Length);
|
||
}
|
||
catch(Exception err)
|
||
{
|
||
E_LogInsert("Tighten", "Error", "270:" + err.Message);
|
||
return (int)RETURN_ERR_STATE.RETURN_ERR;
|
||
}
|
||
|
||
return buffer.Length;
|
||
}
|
||
|
||
private int hw_receive(byte[] buffer, int offset, int max_len)
|
||
{
|
||
int rc = tcp_receive(_client, buffer, offset, max_len);
|
||
|
||
string str = null;
|
||
if(rc < 0)
|
||
{
|
||
if(rc != (int)RETURN_ERR_STATE.RETURN_ESTOP)
|
||
{
|
||
string err_str = "拧紧枪接收数据异常!";
|
||
E_LogInsert("Tighten", "Error", err_str);
|
||
}
|
||
}
|
||
else if (rc > 0)
|
||
{
|
||
//buffer = new byte[] { 0x02 ,0x00, 0x00, 0x00, 0xd9, 0x54, 0x30, 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x31, 0x30, 0x3d, 0x30, 0x2e, 0x32, 0x39, 0x37, 0x2c, 0x33, 0x32, 0x30, 0x38, 0x2e, 0x35, 0x36, 0x33, 0x2c, 0x31, 0x2e, 0x36, 0x35, 0x31, 0x3b, 0x30, 0x30, 0x30, 0x31, 0x31, 0x3d, 0x31, 0x3b, 0x30, 0x30, 0x30, 0x31, 0x32, 0x3d, 0x30, 0x3b, 0x30, 0x31, 0x30, 0x31, 0x30, 0x3d, 0x30, 0x2e, 0x30, 0x31, 0x33, 0x2c, 0x2d, 0x38, 0x39, 0x2e, 0x39, 0x35, 0x34, 0x2c, 0x30, 0x2e, 0x31, 0x37, 0x34, 0x3b, 0x30, 0x31, 0x30, 0x31, 0x31, 0x3d, 0x30, 0x3b, 0x30, 0x31, 0x30, 0x32, 0x30, 0x3d, 0x30, 0x2e, 0x30, 0x30, 0x38, 0x2c, 0x38, 0x39, 0x2e, 0x39, 0x35, 0x34, 0x2c, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x3b, 0x30, 0x31, 0x30, 0x32, 0x31, 0x3d, 0x30, 0x3b, 0x30, 0x31, 0x30, 0x33, 0x30, 0x3d, 0x30, 0x2e, 0x30, 0x30, 0x36, 0x2c, 0x32, 0x37, 0x39, 0x39, 0x2e, 0x34, 0x37, 0x32, 0x2c, 0x30, 0x2e, 0x34, 0x30, 0x39, 0x3b, 0x30, 0x31, 0x30, 0x33, 0x31, 0x3d, 0x30, 0x3b, 0x30, 0x31, 0x30, 0x34, 0x30, 0x3d, 0x30, 0x2e, 0x30, 0x35, 0x39, 0x2c, 0x33, 0x30, 0x37, 0x2e, 0x36, 0x37, 0x38, 0x2c, 0x30, 0x2e, 0x32, 0x35, 0x36, 0x3b, 0x30, 0x31, 0x30, 0x34, 0x31, 0x3d, 0x30, 0x3b, 0x30, 0x31, 0x30, 0x35, 0x30, 0x3d, 0x30, 0x2e, 0x32, 0x39, 0x37, 0x2c, 0x31, 0x30, 0x2e, 0x33, 0x31, 0x33, 0x2c, 0x30, 0x2e, 0x34, 0x39, 0x32, 0x3b, 0x30, 0x31, 0x30, 0x35, 0x31, 0x3d, 0x30, 0x3b, 0x03 };
|
||
//rc = buffer.Length;
|
||
var hex_str = bytes_to_hex_string(buffer, offset, rc);
|
||
var raw_str = bytes_to_string(buffer, offset, rc);
|
||
if (E_ScanContent != null)
|
||
{
|
||
E_ScanContent.Invoke(hex_str, raw_str);
|
||
}
|
||
|
||
}
|
||
|
||
//if (str != null)
|
||
// tbxProtocolDebug_show(str);
|
||
|
||
return rc;
|
||
}
|
||
|
||
private int hw_send(ToolPacket packet)
|
||
{
|
||
int rc = 0;
|
||
ToolPacket send_packet = null;
|
||
|
||
send_packet = packet;
|
||
|
||
byte[] buffer = send_packet.compose_protocol();
|
||
|
||
rc = tcp_send(_client, buffer);
|
||
|
||
string str = null;
|
||
if (rc < 0)
|
||
{
|
||
try
|
||
{
|
||
E_LogInsert("Tighten", "Error", ((RETURN_ERR_STATE)rc).ToString());
|
||
}
|
||
catch (Exception err)
|
||
{
|
||
E_LogInsert("Tighten", "Error", rc.ToString() + "_" + err.Message);
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
string send_str = "拧紧枪发送数据!";
|
||
E_LogInsert("Tighten", "Info", send_str);
|
||
//string hex_str = "send: " + bytes_to_hex_string(buffer, 0, buffer.Length);
|
||
string raw_str = " " + bytes_to_string(buffer, 0, buffer.Length);
|
||
E_LogInsert("Tighten", "Info", raw_str);
|
||
}
|
||
|
||
//if(str != null)
|
||
// tbxProtocolDebug_show(str);
|
||
|
||
return rc;
|
||
}
|
||
private void hw_send_HeartBeat()
|
||
{
|
||
ToolPacket packet = new ToolPacket();
|
||
packet.op = 'R';
|
||
packet.mid = "0204";
|
||
packet.data_domain_str = "";
|
||
|
||
new Thread(new ThreadStart(delegate () {
|
||
while (true)
|
||
{
|
||
try
|
||
{
|
||
int rc = 0;
|
||
byte[] buffer = packet.compose_protocol();
|
||
rc = tcp_send(_client, buffer);
|
||
if (rc < 0)
|
||
{
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("0");
|
||
}
|
||
E_LogInsert("Tighten_HeartBeat", "Error", RETURN_ERR_STATE.RETURN_ESTOP.ToString());
|
||
}
|
||
else
|
||
{
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("1");
|
||
}
|
||
|
||
}
|
||
}
|
||
catch (Exception err)
|
||
{
|
||
E_LogInsert("Tighten_HeartBeat", "Error", err.Message);
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("0");
|
||
}
|
||
}
|
||
Thread.Sleep(5000);
|
||
}
|
||
}))
|
||
{ IsBackground = true }.Start();
|
||
}
|
||
byte[] normal_buf = new byte[1024];
|
||
|
||
private void parse_entry()
|
||
{
|
||
Control.CheckForIllegalCrossThreadCalls = false;
|
||
|
||
while (true)
|
||
{
|
||
// 未使能运行时,关闭连接,等待使能
|
||
if(!_is_run)
|
||
{
|
||
try
|
||
{
|
||
if (_client != null)
|
||
_client.Close();
|
||
}
|
||
finally
|
||
{
|
||
_client = null;
|
||
}
|
||
|
||
_isconnected = false;
|
||
_first_connect = true;
|
||
|
||
Thread.Sleep(50);
|
||
continue;
|
||
}
|
||
|
||
// 未连接时,连接硬件接口,失败 2s 周期重连
|
||
if(!_isconnected)
|
||
{
|
||
// 不使能重连
|
||
if(!_is_reconnect && !_first_connect)
|
||
{
|
||
try
|
||
{
|
||
if (_client != null)
|
||
_client.Close();
|
||
}
|
||
finally
|
||
{
|
||
_client = null;
|
||
}
|
||
|
||
Thread.Sleep(50);
|
||
continue;
|
||
}
|
||
|
||
_first_connect = false;
|
||
_reconnect_cnt++;
|
||
|
||
if (tcp_connect(ref _client, this.ip, this.port.ToString()))
|
||
{
|
||
string send_str = "拧紧枪网络连接成功";
|
||
E_LogInsert("Tighten", "Info", send_str);
|
||
_isconnected = true;
|
||
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("1");
|
||
}
|
||
|
||
|
||
/*
|
||
MID 操作类型 描述 备注
|
||
0001 R 建立通信连接
|
||
0002 R 断开连接
|
||
0103 W Pset选择
|
||
0201 R 运行状态 Ready/RUN/OK/NG/Err
|
||
0202 R 最终拧紧结果
|
||
0203 R 实时曲线数据
|
||
0301 W 电机运行正转/反转使能 CW/CCW
|
||
*/
|
||
var packet = new ToolPacket();
|
||
packet.op = 'R';
|
||
packet.mid = "0202";
|
||
packet.data_domain_str = "";
|
||
hw_send(packet);
|
||
|
||
Thread.Sleep(50);
|
||
continue;
|
||
}
|
||
else
|
||
{
|
||
string send_str = "拧紧枪网络连接失败";
|
||
E_LogInsert("Tighten", "Error", send_str);
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("0");
|
||
}
|
||
}
|
||
|
||
Thread.Sleep(2000);
|
||
continue;
|
||
}
|
||
|
||
int recv_len = hw_receive(normal_buf, 0, normal_buf.Length);
|
||
if (recv_len < 0)
|
||
{
|
||
Thread.Sleep(50);
|
||
_isconnected = false;
|
||
if (E_DeviceHeartBeat != null)
|
||
{
|
||
E_DeviceHeartBeat.Invoke("0");
|
||
}
|
||
continue;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
public class TightenParam
|
||
{
|
||
public string hex { get; set; }
|
||
public string raw { get; set; }
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|