上一篇说明了基于nmodbus的rtu的连接,本次来介绍一下TCP实现基于modbus的通信,毕竟以后tcp通过ip地址通信才能更简单。和上一篇差不多。
一、首先放出参考的有价值的NModbus网站
1.modbus tools 全英解释 https://modbustools.com/download.html 官方 详细解释说明
2.Modbus/Nmodbus 中文繁体版 http://www.icpdas.com/products/PAC/i-8000/modbus_c.htm 官方
3.我所用的测试连通的工具
salve poll https://download.csdn.net/download/lsc_hei/10709595以及
vspd https://download.csdn.net/download/lsc_hei/10729508工具
测试串口连通性工具 https://download.csdn.net/download/lsc_hei/10742111
TCp测试网络是否连通,才测试程序的正确性https://download.csdn.net/download/lsc_hei/10745748
十六进制转float https://download.csdn.net/download/lsc_hei/10742108
4.NModbus api说明文档 即本人根据完成的 https://download.csdn.net/download/lsc_hei/10750678这个人认为很重要
二、实现TCP的通信连接
以本人所使用的VS2013做法示范;
1.首先新建一个工程点击工具下拉菜单找到--管理NuGet程序包(也可能没有少一项,搞搞就出来了,很简单)--然后搜索你需要的包(nmodbus4,记得选择nuget 不然可能找不到)--点击安装即可。安装完成后引入命名控件using Modbus.Deice 然后去创建你的winform就行了,因为我是用winform,其他的类似,请自行比对。
在这里,主站和从站之分便没有了,有的是服务器和客户端之分,我使用的是USR-TCP232-304/RS485 TO ETHERNET CONVERTER 连接从电表分出来的rs485专线口,modbus tcp 没有主站、从站之分,但是有服务器(Server)与客户端(Client)之分:发出数据请求的一方为客户端(Client),做出数据应答的的一方为服务器(Server)。服务器(Server)与客户端(Client)分别类似于modbus rtu从站、主站的作用,但它们之间没有任何关系。modbus tcp协议和modbus协议通过tcp传输其实就是同一回事。
电表连接的那个转换口,可以作为服务器也可以作为客户端。我将端口数据作为服务器端,即将pc段自己做的作为客户端去触发服务器端的监听事件,即服务器端应为slave作为监听,pc端作为master去触发监听得到响应数据。 大家也可以试试把带有电表的那一端作为客户端试试。。。。
*/*和串口差不多,tcp按理说也应该和串口一致,繁体示范上面也区分了 slave和master 只是设置了一个ip地址 我按照串口的方法改到一起,但是不知道什么原因,一直连接不成功,不能正常返回数据,找了半天也没找到原因,master端demo上写的是读到服务器ip 然后建立连接,slave端是获取本地ip然后建立监听进行响应,这样一弄就完全混乱了,我该怎么设置ip等等
源代码贴出,以备后用https://download.csdn.net/download/lsc_hei/10751379
二‘最后百思不得其解,不行转换思路,直接做了一个 TCP IP的客户端,用最简单的方法实现就是客户端发送数据socket,得到服务器的响应数据,连多线程都不用,唯一的就是委托,跨控件而已。
唉 当初学tcp的时候怎么没想到现在竟然能这么简单的用到。。。。
然后对数据进行处理,得到的数据是十进制单位,看返回的有几个字节,就是几个十进制,然后按照自己的需求搞
我所运用示例
txtReceive.Text += "得到的十进制为" + holdingregister[0].ToString() + "和"+ holdingregister[1].ToString() + ";
同时 将得到的十进制转化为16进制然后再转化为float进行输出,看个人需求
string hexString = Convert.ToString(holdingregister[0], 16) + Convert.ToString(holdingregister[1], 16);
uint num = uint.Parse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier);
byte[] floatVals = BitConverter.GetBytes(num);
float f = BitConverter.ToSingle(floatVals, 0);
txtReceive.Text += "转换成的float数为:" + f;
完成
三、
如图所示的tcp测试连通性软件,将本机作为客户端。
[发送]94 03 00 00 00 02 D9 0E
[接收]94 03 04 3D 8F 5C 29 FB A3
说明:设备地址(1字节)+功能号(1)+寄存器起始地址(2字节)+读取的寄存器数(2)+CRC校验
说明:设备地址(1字节)+功能号(1)+返回的字节数+数据1+数据2+...+等于字节数+CRC校验
返回的字节数=2*读取的寄存器数
四、
哎等有空了 还得仔细研究一下这个,还好网上有这么多人 站在各位前辈的成果之上 感谢。
源代码地址:已完成https://download.csdn.net/download/lsc_hei/10751276
https://download.csdn.net/download/lsc_hei/10750738
对了这是官方示例的demo拿好各位https://download.csdn.net/download/lsc_hei/10750717