上一篇说明了基于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
    
   
 
