复制粘贴代码到VSCode 或LinqPad 中,执行即可,需要.net8。在我的电脑上实验成功,欢迎反馈不同型号的结果。触摸屏重启后手动进入触摸屏校准,执行完成校准后会询问是否恢复下载密码,输入yes之后,会清空内部的项目。
Visual Studio 源码文件和编译成可执行exe文件WeintekTest.rar
using System.Net.Sockets; using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; namespace WeintekTest; class Program { static string uploadTelegram = "50010000001a67657466696c65202f6d74383030302f3030312f6d7438303030";//上传数据报文 static Weintek weintek = new Weintek("192.168.20.51"); static Weintek weintek2 = new Weintek("192.168.20.51", 20248); static void Main(string[] args) { //Fun1(); //Console.Read(); ClearTool(); } static void DoWork1(string str) { var rec = weintek.Send(str); if (rec == null) { Console.WriteLine("无返回内容!"); return; } Console.WriteLine(BitConverter.ToString(rec).Replace("-", " ")); } static void DoWork2(string str) { var rec = weintek2.Send(str); if (rec == null) { Console.WriteLine("无返回内容!"); return; } Console.WriteLine(BitConverter.ToString(rec).Replace("-", " ")); } static void Fun0() { var dat = weintek2.Send("400100000000"); DoWork2(BitConverter.ToString(dat).Replace("-", "")); List<string> strs = new List<string>() { //"400100000000", //"40010002004042433534454330444644434235323141414644393642344136334141314442423946413242373542433932394543393446334530363133433637424241463534", "4001000400320001384442464236374242424445373841443334333133334442364643353239303941324244393244464433383143393035", //"4001000400320001373138464136323446384132423737433941304436384632394530383339303346304243363638323045313344354538", "50010000001a67657466696c65202f6d74383030302f3030312f6d7438303030" //"5001000000114f535f76657273696f6e20303431303032", //"50010000000473746f70" }; foreach (var str in strs) { DoWork2(str); }; } static void Fun1() { File.WriteAllText("res.txt", ""); for (int i = 9000; i < 12900; i++) { string str = $"{DateTime.Now}:LW{i}:\t" + weintek.GetLW(i) + Environment.NewLine; //File.AppendAllText("res.txt",str); //Thread.Sleep(10); } Console.WriteLine("Done!"); Console.Read(); } static void ClearTool() { //Console.WriteLine("如要确认执行请按'Y'键:"); //var key=Console.ReadKey(); //Console.WriteLine(); //if(key.Key != ConsoleKey.Y) { //Console.WriteLine("已取消执行!"); //Console.Read(); //return; } Console.WriteLine("请谨慎操作!"); Console.WriteLine("触摸屏将在稍后重启,请在触摸屏重启后手动进入并执行触摸屏校准!"); Console.WriteLine("校准完成后,会弹出对话框询问是否重置密码,输入'yes'即可清空内部项目并重置下载密码!"); for (int i = 10; i > 0; i--) { //倒计时执行 Console.WriteLine($"倒计时:{i}秒."); Thread.Sleep(1000); } Console.WriteLine("正在更新日期时间..."); //更新日期时间 weintek.SetLW(9022, (short)DateTime.Now.Year);//更新年 weintek.SetLW(9021, (short)DateTime.Now.Month);//更新月 weintek.SetLW(9020, (short)DateTime.Now.Day);//更新日 weintek.SetLW(9019, (short)DateTime.Now.Hour);//更新时 weintek.SetLW(9018, (short)DateTime.Now.Minute);//更新分 weintek.SetLW(9017, (short)DateTime.Now.Second);//更新秒 Console.WriteLine("正在更改系统设置..."); weintek.SetLB(9020, true);//显示系统控制按钮 weintek.SetLB(9033, true);//允许上传 weintek.SetLB(12364, true);//开启屏幕校正后恢复出厂设置的选项 weintek.SetLB(9048, true);//开启重启保护 weintek.SetLB(9047, true);//重启触摸屏 //设定LB寄存器时返回报文实例 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-01-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-02-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-03-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-04-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-05-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 Console.WriteLine("Done!"); Console.Read(); } public class Weintek { string _ip; int _port = 8000; byte _index = 0; readonly object lckObj = new object(); public Weintek(string ip) { _ip = ip; _port = 8000; } public Weintek(string ip, int port) { _ip = ip; _port = port; } byte GetIndex() { lock (lckObj) { return ++_index; } } int GetEasyWatchIndex() { return 1; } public bool GetLB(int regAddress) { return GetLB(regAddress,1); } public bool GetLB(int regAddress,int count) { //读LB12364 //PC发: 01600000ff000000000008000c 00e5 0300000100000000000000000000ff 0403 000001000000 //HMI回true: 01600000ff0000000000080005 00e5 030000010000000000000000000000000000 0010 0000 //大端 //HMI回false: 01600000ff0000000000080005 00e5 030000010000000000000000000000000000 0000 0000 //大端 //读LB9047 //PC发: 01600000ff000000000008000c 00fb 0300000200000000000000000000ff 3502 000001000000 //读LB9048 //PC发: 01600000ff000000000008000c 00fe 0300000300000000000000000000ff 3502 000001000000 try { bool ret = false; string sendHeader = "01600000ff000000000008000c00"; string sendConstStr1 = "0300000100000000000000000000ff"; string receiveHeader = "01600000ff000000000008000500"; var sendStr = sendHeader; sendStr += GetIndex().ToString("x2"); sendStr += sendConstStr1; sendStr += GetLBAddress(regAddress).Substring(0, 8); sendStr += ToLittleEndian((UInt32)count).ToString("x8"); var receiveData = Send(sendStr); var receiveStr = BitConverter.ToString(receiveData).Replace("-", "").ToLower(); if (receiveStr.Length > receiveHeader.Length && receiveStr.StartsWith(receiveHeader) && string.Compare(sendStr.Substring(sendHeader.Length, 2), receiveStr.Substring(receiveHeader.Length, 2)) == 0) { var dat = ToLittleEndian(Convert.ToUInt16(receiveStr.Substring(66, 4), 16)); var temp = Convert.ToUInt16(Math.Pow(2, regAddress % 0x10)); ret = (dat & temp) > 0; return ret; } return ret; } catch (Exception ex) { Console.WriteLine($"GetLb_{DateTime.Now}:\t" + ex.Message); return false; } } /// <summary> /// 设置触摸屏的LB寄存器(系统寄存器的值) /// </summary> /// <param name="ip">触摸屏的地址</param> /// <param name="port">链接端口号,默认值为8000</param> /// <param name="index">报文序号,返回报文的序号和发送报文序号相同</param> /// <param name="regAddress">LB寄存器地址</param> /// <param name="Value">设定值</param> public bool SetLB(int regAddress, bool Value) { //设定LB寄存器时返回报文实例 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-01-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-02-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-03-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-04-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 //2024/4/13 10:36:54+_接收内容33: 01-60-00-00-FF-00-00-00-00-00-08-00-01-00-05-00-00-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-02 try { string sendHeader = "01600000ff000000000008000c00"; string sendConstStr = "0000000100000000000000020000ff";//前面的01是EasyWatch序号,排第一个的为01,第二个的为02,在此处无关紧要 string receiveHeader = "01600000FF000000000008000100"; var sendStr = sendHeader; sendStr += GetIndex().ToString("x2"); sendStr += sendConstStr; sendStr += GetLBAddress(regAddress); sendStr += Value ? "ff" : "00"; sendStr += "0000"; var receiveData = Send(sendStr); var receiveStr = BitConverter.ToString(receiveData).Replace("-", "").ToLower(); if (receiveStr.Length > receiveHeader.Length && receiveStr.StartsWith(receiveHeader) && string.Compare(sendStr.Substring(sendHeader.Length, 2), receiveStr.Substring(receiveHeader.Length, 2)) == 0 ) { return true; } return false; } catch (Exception ex) { Console.WriteLine($"SetLb_{DateTime.Now}:\t" + ex.Message); return false; } } static string GetLBAddress(int addr) { string ret = ""; string str = addr.ToString("X5"); ret += str.Substring(2, 2); ret += str.Substring(0, 2); ret += "00000"; ret += str.Substring(4, 1); return ret; } public Int16 GetLW(int regAddress) { return GetLW(regAddress, 1); } /// <summary> /// 读取LW寄存器的值 /// </summary> /// <param name="ip">触摸屏IP地址</param> /// <param name="port">端口</param> /// <param name="index">包序号</param> /// <param name="regAddress">LW寄存器地址</param> /// <param name="count">寄存器个数,当前只支持1个寄存器</param> /// <returns>返回值</returns> public Int16 GetLW(int regAddress, int count) { //读LW9009 //PC发: 01600000ff000000000008000c00 be 0300003600000000000000000008ff 3123 0000 0100 0000 //HMI回: 01600000ff000000000008000500 be 030000360000000000000000000000000000 4040 0000 //PC发: 01600000ff000000000008000c00 bc 0300003600000000000000000008ff 3123 0000 0100 0000 //HMI回: 01600000ff000000000008000500 bc 030000360000000000000000000000000000 4040 0000 try { UInt16 ret = 0; string sendHeader = "01600000ff000000000008000c00"; string sendRegConstStr = "0300003600000000000000000008ff"; string receiveHeader = "01600000ff000000000008000500"; string sendStr = sendHeader; sendStr += GetIndex().ToString("x2"); sendStr += sendRegConstStr; sendStr += ToLittleEndian((UInt16)regAddress).ToString("x4"); sendStr += "0000"; sendStr += ToLittleEndian((UInt16)count).ToString("x4"); sendStr += "0000"; var receiveData = Send(sendStr); var receiveStr = BitConverter.ToString(receiveData).Replace("-", "").ToLower(); if (receiveStr.Length > receiveHeader.Length && //长度无无异常 receiveStr.StartsWith(receiveHeader) && //接收头校验成功 string.Compare(sendStr.Substring(sendHeader.Length, 2), receiveStr.Substring(receiveHeader.Length, 2)) == 0 //包序号校验成功 ) { var s1 = receiveStr.Substring(66, 4); ret = Convert.ToUInt16(s1, 16); return (Int16)ToLittleEndian(ret); } return -1; } catch (Exception ex) { Console.WriteLine($"GetLw_{DateTime.Now}:\t" + ex.Message); return -1; } } public bool SetLW(int regAddress, Int16 value) { //写LW9022=2024 (0xE807)|9022=0x3e23 //PC发: 01600000ff000000000008000e 00d9 0300005100000000000000010008ff 3e23 0000 0100 e807 0000 //HMI回: 01600000ff0000000000080001 00d9 030000510000000000000000000000000001 // 01600000ff0000000000080001 0001 030000510000000000000000000000000001 try { string sendHeader = "01600000ff000000000008000e00"; string sendRegConstStr = "0300005100000000000000010008ff"; string receiveHeader = "01600000ff000000000008000100"; string sendStr = sendHeader; sendStr += GetIndex().ToString("x2"); sendStr += sendRegConstStr; sendStr += ToLittleEndian((UInt16)regAddress).ToString("x4"); sendStr += "0000"; sendStr += ToLittleEndian(1).ToString("x4");//数量 sendStr += ToLittleEndian((UInt16)value).ToString("x4"); sendStr += "0000"; var receiveData = Send(sendStr); var receiveStr = BitConverter.ToString(receiveData).Replace("-", "").ToLower(); if (receiveStr.Length > receiveHeader.Length && //长度无无异常 receiveStr.StartsWith(receiveHeader) && //接收头校验成功 string.Compare(sendStr.Substring(sendHeader.Length, 2), receiveStr.Substring(receiveHeader.Length, 2)) == 0 //包序号校验成功 ) { return true; } return false; } catch (Exception ex) { Console.WriteLine($"SetLw_{DateTime.Now}:\t" + ex.Message); return false; } } //1234=0x04D2(LE)/0xD204(BE) //16bit读写 //RW1234 //读值 //值为0 //PC发: 01600000ff000000000008000c00 01 000000030000000000000000008dff d204 0000 0100 0000 //HMI回: 01600000ff000000000008000500 01 000000030000000000000000000000000000 0000 0000 //值为1234 //PC发: 01600000ff000000000008000c00 21 000000030000000000000000008dff d204 0000 0100 0000 //HMI回: 01600000ff000000000008000500 21 000000030000000000000000000000000000 d204 0000 //写值1234 //PC发: 01600000ff000000000008000e00 20 000000030000000000000001008dff d204 0000 0100 d204 0000 //HMI回: 01600000ff000000000008000100 20 000000030000000000000000000000000001 //32bit写 //RW1234=4567 4567=0x11D7(LE)/D711(BE) //PC发: 01600000ff000000000008001000 43 000000030000000000000001008dff d204 0000 0200 d7110000 0000 //HMI回: 01600000ff000000000008000100 43 000000030000000000000000000000000001 //32bit读 //PC发: 01600000ff000000000008000c00 44 000000030000000000000000008dff d204 0000 0200 0000 //HMI回: 01600000ff000000000008000700 44 000000030000000000000000000000000000 d7110000 0000 public Int16 GetRW(int regAddress) { return GetRW(regAddress, 1); } public Int16 GetRW(int regAddress, int count) { try { UInt16 ret = 0; string sendHeader = "01600000ff000000000008000c00"; string sendRegConstStr = "000000030000000000000000008dff"; string receiveHeader = "01600000ff000000000008000500"; string sendStr = sendHeader; sendStr += GetIndex().ToString("x2"); sendStr += sendRegConstStr; sendStr += ToLittleEndian((UInt16)regAddress).ToString("x4"); sendStr += "0000"; sendStr += ToLittleEndian((UInt16)count).ToString("x4"); sendStr += "0000"; var receiveData = Send(sendStr); var receiveStr = BitConverter.ToString(receiveData).Replace("-", "").ToLower(); if (receiveStr.Length > receiveHeader.Length && //长度无无异常 receiveStr.StartsWith(receiveHeader) && //接收头校验成功 string.Compare(sendStr.Substring(sendHeader.Length, 2), receiveStr.Substring(receiveHeader.Length, 2)) == 0 //包序号校验成功 ) { var s1 = receiveStr.Substring(66, 4); ret = Convert.ToUInt16(s1, 16); return (Int16)ToLittleEndian(ret); } return -1; } catch (Exception ex) { Console.WriteLine($"GetLw_{DateTime.Now}:\t" + ex.Message); return -1; } } public bool SetRW(int regAddress, Int16 value) { try { string sendHeader = "01600000ff000000000008000e00"; string sendRegConstStr = "000000030000000000000001008dff"; string receiveHeader = "01600000ff000000000008000100"; string sendStr = sendHeader; sendStr += GetIndex().ToString("x2"); sendStr += sendRegConstStr; sendStr += ToLittleEndian((UInt16)regAddress).ToString("x4"); sendStr += "0000"; sendStr += ToLittleEndian(1).ToString("x4"); sendStr += ToLittleEndian((UInt16)value).ToString("x4"); sendStr += "0000"; var receiveData = Send(sendStr); var receiveStr = BitConverter.ToString(receiveData).Replace("-", "").ToLower(); if (receiveStr.Length > receiveHeader.Length && //长度无无异常 receiveStr.StartsWith(receiveHeader) && //接收头校验成功 string.Compare(sendStr.Substring(sendHeader.Length, 2), receiveStr.Substring(receiveHeader.Length, 2)) == 0 //包序号校验成功 ) { return true; } return false; } catch (Exception ex) { Console.WriteLine($"SetLw_{DateTime.Now}:\t" + ex.Message); return false; } } readonly object lckSend = new object(); public byte[] Send(string str) { //lock(lckSend) { try { using (TcpClient client = new TcpClient()) { client.ReceiveTimeout = 500; client.Connect(_ip, _port); var s = client.GetStream(); var sendData = HexStringToByteArray(str); s.Write(sendData); byte[] buffer = new byte[1024]; int n = s.Read(buffer); byte[] receiveData = new byte[n]; Array.Copy(buffer, receiveData, n); //Console.WriteLine($"{DateTime.Now.ToString()}+_接收内容{receiveData.Length}:\t" + BitConverter.ToString(receiveData)); return receiveData; } } catch (Exception ex) { Console.WriteLine($"Send_{DateTime.Now}:\t" + ex.Message); return null; } } } /// <summary> /// 十六进制字符串转字节数组,.Net7以后Convert带有ToHexString()和FromHexString()方法,此处保留 /// </summary> /// <param name="str">要转换的字符串</param> /// <returns></returns> static byte[] HexStringToByteArray(string str) { return Enumerable.Range(0, str.Length).Where(x => (x % 2) == 0).Select(y => (byte)Convert.ToByte(str.Substring(y, 2), 16)).ToArray(); } /// <summary> /// 大端转小端和小端转大端的操作是相同的,共用同一个即可 /// </summary> /// <param name="dat">要转换的内容</param> /// <returns></returns> static UInt16 ToLittleEndian(UInt16 dat) { return BitConverter.ToUInt16(BitConverter.GetBytes(dat).Reverse().ToArray()); } /// <summary> /// 大端转小端和小端转大端的操作是相同的,共用同一个即可 /// </summary> /// <param name="dat">要转换的内容</param> /// <returns></returns> static UInt32 ToLittleEndian(UInt32 dat) { return BitConverter.ToUInt32(BitConverter.GetBytes(dat).Reverse().ToArray()); } } }
版权声明:本文内容来源于网络搜集无法获知原创作者,仅供个人学习用途,若侵犯到您的权益请联系我们及时删除。邮箱:1370723259@qq.com