using HslCommunication; using HslCommunication.Profinet.Omron; using HslCommunication.Profinet.Siemens; using ICSharpCode.Core; using Mesnac.Compressor.Data; using Mesnac.Log; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace LaserMarking { internal class Program { private static int OldRFID = 0; // 定时器对象 private static Timer _timer; // 用于记录检测次数 private static int _checkCount = 0; static HslCommunication.Profinet.Melsec.MelsecMcNet plc = new HslCommunication.Profinet.Melsec.MelsecMcNet(); public static bool IsConnected { get; set; } static void Main(string[] args) { //Example(); init(); Connect("192.168.0.20", 2000); CreatEquipClient(); Console.ReadLine(); } public static bool Convert16(string decimalStr, out string hexStr, bool uppercase = true) { hexStr = string.Empty; // 检查输入是否为空 if (string.IsNullOrWhiteSpace(decimalStr)) return false; // 尝试将字符串解析为整数 if (int.TryParse(decimalStr, out int decimalNumber)) { // 转换为16进制,X表示大写,x表示小写 hexStr = decimalNumber.ToString(uppercase ? "X" : "x"); return true; } // 如果int类型不够,可以尝试long类型 if (long.TryParse(decimalStr, out long decimalLong)) { hexStr = decimalLong.ToString(uppercase ? "X" : "x"); return true; } return false; } // 示例用法 public static void Example() { string decimalString = "4102"; if (Convert16(decimalString, out string hexString)) { Console.WriteLine($"10进制 {decimalString} 转换为16进制是: {hexString}"); // 输出 FF } else { Console.WriteLine($"无法将 {decimalString} 转换为16进制"); } } private static void init() { if (!HslCommunication.Authorization.SetAuthorizationCode("54c90c9e-3625-4136-b9c7-1f02885925c8")) { LogService.Instance.Debug("HslCommunication 11.0.6.0激活失败"); return; } LogService.Instance.Debug("HslCommunication 11.0.6.0激活成功"); plc.NetworkNumber = 0; plc.NetworkStationNumber = 0; plc.TargetIOStation = 1023; plc.EnableWriteBitToWordRegister = false; plc.ByteTransform.IsStringReverseByteWord = false; } public static bool Connect(string IP, int port) { plc.CommunicationPipe = new HslCommunication.Core.Pipe.PipeTcpNet(IP, port) { ConnectTimeOut = 5000, // 连接超时时间,单位毫秒 ReceiveTimeOut = 10000, // 接收设备数据反馈的超时时间 }; System.Net.IPAddress address; if (!System.Net.IPAddress.TryParse(IP, out address)) { // MessageBox.Show("Ip地址输入不正确!"); return false; } plc.IpAddress = IP; try { OperateResult connect = plc.ConnectServer(); if (connect.IsSuccess) { IsConnected = true; return true; } else { LogService.Instance.Debug("连接失败!"); IsConnected = false; return false; } } catch (Exception ex) { LogService.Instance.Debug(ex.Message); IsConnected = false; return false; } } public static string readStringByAddress(string address, ushort length) { try { OperateResult read = plc.ReadString(address, length); if (read.IsSuccess) { LogService.Instance.Debug(String.Format("通过PLC地址{0}读取string类型数据成功:{1}", address, read.Content)); return read.Content; } LogService.Instance.Debug(String.Format("通过PLC地址{0}读取string类型数据失败!!!", address)); IsConnected = false; return ""; } catch (Exception ex) { LogService.Instance.Error("通过PLC地址读取int32类型数据异常", ex); return ""; } } public static int readInt32ByAddress(string address) { int returnflag = 0; try { //LogService.Instance.Debug(String.Format("开始通过PLC地址{0}读取int32类型数据", address)); OperateResult read = plc.ReadInt32(address); if (read.IsSuccess) { //LogService.Instance.Debug(String.Format("通过PLC地址{0}读取int32类型数据成功:{1}", address, read.Content)); returnflag = read.Content; } else { LogService.Instance.Error(String.Format("通过PLC地址{0}读取int32类型数据失败{1}", address, read.Message)); IsConnected = false; } } catch (Exception ex) { IsConnected = false; } return returnflag; } public static int readInt16ByAddress(string address) { //LogHelper.PlcLog(String.Format("开始通过PLC地址{0}读取int32类型数据",address)); try { OperateResult read = plc.ReadInt16(address); if (read.IsSuccess) { if (read.Content != 0) { //LogService.Instance.Debug(String.Format("通过PLC地址{0}读取int16类型数据成功:{1}", address, read.Content)); } return read.Content; } LogService.Instance.Debug(String.Format("通过PLC地址{0}读取int16类型数据失败!!!", address)); IsConnected = false; return 0; } catch (Exception ex) { LogService.Instance.Error("通过PLC地址读取int16类型数据异常", ex); IsConnected = false; return 0; } } public static bool writeInt16ByAddress(string address, int value) { //LogHelper.PlcLog(String.Format("开始通过PLC地址{0}写入int32类型数据{1}", address, value)); try { OperateResult write = plc.Write(address, short.Parse(Convert.ToString(value))); if (write.IsSuccess) { LogService.Instance.Debug(String.Format("通过PLC地址{0}写入int16类型数据{1}成功", address, value)); return true; } LogService.Instance.Debug(String.Format("通过PLC地址{0}写入int16类型数据{1}失败!!!", address, value)); IsConnected = false; return false; } catch (Exception ex) { LogService.Instance.Error(String.Format("通过PLC地址{0}写入int16类型数据异常", address), ex); IsConnected = false; return false; } } public static bool writeValueByAddress(int value, string address) { //LogHelper.PlcLog(String.Format("开始通过PLC地址{0}写入int类型数据{1}",address,value)); try { OperateResult operateResult = plc.Write(address, Convert.ToInt32(value)); if (operateResult.IsSuccess) { LogService.Instance.Debug(String.Format("开始通过PLC地址{0}写入int类型数据{1}成功", address, value)); return true; } LogService.Instance.Debug(String.Format("开始通过PLC地址{0}写入int类型数据{1}失败!!!", address, value)); IsConnected = false; return false; } catch (Exception ex) { LogService.Instance.Error("通过PLC地址写入int类型数据", ex); IsConnected = false; return false; } } public static bool writeStringByAddress(string address, string value) { //LogHelper.PlcLog(String.Format("通过PLC地址{0}写入String类型数据{1}",address,value)); try { OperateResult operateResult = plc.Write(address, value); if (operateResult.IsSuccess) { LogService.Instance.Debug(String.Format("通过PLC地址{0}写入String类型数据{1}成功", address, value)); return true; } LogService.Instance.Debug(String.Format("通过PLC地址{0}写入String类型数据{1}失败!!!", address, value)); //this.IsConnected = false; return false; } catch (Exception ex) { LogService.Instance.Error(String.Format("通过PLC地址{0}写入String类型数据异常", address), ex); //this.IsConnected = false; return false; } } public static void CreatEquipClient() { var t = Task.Run(async delegate { while (true) { try { //查询交互字 int Flag = readInt16ByAddress("D1557"); if (Flag == 1) { //先置位 bool iflag = writeInt16ByAddress("D1557",0); int RFID = readInt16ByAddress("D1555"); if (RFID != 0) { if (RFID != OldRFID) { OldRFID = RFID; //通过RFID号查询产品码 LoggingService.Debug("获取RFID:" + RFID); string semibarcode = ""; //10进制转16进制 if (Convert16(RFID.ToString(), out string hexString)) { LogService.Instance.Debug($"10进制 {RFID.ToString()} 转换为16进制是: {hexString}"); // 输出 FF DbHandler dbHandler = new DbHandler(); semibarcode = DbHandler.GetTraySemiBarcode(hexString); } if (!string.IsNullOrEmpty(semibarcode)) { string productbarcode = DbHandler.GetMainBarcode(semibarcode); LogService.Instance.Debug("通过RFID获取条码:" + productbarcode); if (!string.IsNullOrEmpty(productbarcode)) { //先置位 bool iflag1 = writeInt16ByAddress("D1557", 2); //写入PLC writeStringByAddress("D1561", productbarcode); //int iflag1 = readInt16ByAddress("D1559"); //if (readInt16ByAddress("D1559") == 1) //{ // bool iflag2 = writeInt16ByAddress("D1559", 2); //} } else { //先置位 bool iflag1 = writeInt16ByAddress("D1557", 3); } } else { //先置位 bool iflag1 = writeInt16ByAddress("D1557", 3); } } } } } catch (Exception ex) { LogService.Instance.Error(ex.ToString()); } await Task.Delay(1000); } }); } } }