基于C#的Modbus的(NModbus)研究(DTS686电表)——实现TCP通信连接(二)

上一篇说明了基于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这个人认为很重要

基于C#的Modbus的(NModbus)研究(DTS686电表)——实现TCP通信连接(二)_第1张图片

二、实现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;

完成

三、

基于C#的Modbus的(NModbus)研究(DTS686电表)——实现TCP通信连接(二)_第2张图片

如图所示的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

 

 

你可能感兴趣的:(nmodbus,TCP)