C# Modbus 数据读取 使用NModBus4库

ModBus通讯协议

    

方法名

作用

所需参数

返回值

对应功能码

ReadCoils

读取DO的状态

从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress

读取数量(16位)

ushort numberOfPoints

bool[]

01

ReadInputs

读取DI的状态

从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress

读取数量(16位)

ushort numberOfPoints

bool[]

02

ReadHoldingRegisters

读取AO的值

从站地址(8位)

byte slaveAddress

起始地址(16位) 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

ushort[]

03

ReadInputRegisters

读取AI的值

从站地址(8 位)

byte slaveAddress

起始地址(16位)

ushort startAddress

读取数量(16位)

ushort numberOfPoints

ushort[]

04

WriteSingleCoil

写入值到DO

从站地址(8位)

byte slaveAddress

线圈地址(16位)

ushort coilAddress

写入值(布尔型)

bool value

无返回值

05

WriteSingleRegister

写入值到AO

从站地址(8位)

byte slaveAddress

寄存器地址(16位)

ushort registerAddress

写入值(16位)

ushort value

无返回值

06

WriteMultipleCoils

写多线圈寄存器

从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress

写入值(布尔型数组)

bool[] data

无返回值

15

WriteMultipleRegisters

写多个保持寄存器

从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress,

寄存器值(16位整型数组)

ushort[] data

无返回值

16

ReadWriteMultipleRegisters

读写多个保持寄存器

从站地址(8位)

byte slaveAddress

读起始地址(16位)

ushort startReadAddress

读取数量(16位)

ushort numberOfPointsToRead,

写入起始地址(16位)

ushort startWriteAddress,

写入值(16位整型数组)

ushort[] writeData

ushort[]

23

Modbus Slave

        这个是安装包ModbusSlaveSetup64Bit     注册码:5455415451475662

        

        

modbus通讯协议NET库

    这样的开源库很多,我这边用的库是github的开源实现类库:NModBus4,github地址:https://github.com/NModbus4/NModbus4

          我用Modbus Slave模拟一个从机

            

           设置数据

            

           NModbus4的读取从机代码示例

1 1 IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 2 2 using (TcpClient client = new TcpClient(address.ToString(), 502)) 3 3 { 4 4 client.SendTimeout = 1; 5 5 //client.op 6 6 ModbusIpMaster master = ModbusIpMaster.CreateIp(client); 7 7 //master.op 8 8 // read five input values 9 9 ushort startAddress = 0; 1010 ushort numInputs = 10; 1111 bool[] inputs = master.ReadCoils(1, startAddress, numInputs); 1212 1313 for (int i = 0; i < numInputs; i++) 1414 { 1515 Console.WriteLine($"Input {(startAddress + i)}={(inputs[i] ? 1 : 0)}"); 1616 } 1717 1818 }

   这边值得注意的是主机Read的方法第一个参数是slaveId  如果不加就startAddress And numInputs   NModbus就会默认 slaveId是0  一直异常( d(╯﹏╰)b 痛苦经历~~)

   

   以上数据是 刚才设置的DO 状态

   在演示一个读取AI的值

     

     

     代码没差多少就是方法ReadInputRegisters不一样  . 以下是示例代码

1 1 IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 }); 2 2 using (TcpClient client = new TcpClient(address.ToString(), 502)) 3 3 { 4 4 client.SendTimeout = 1; 5 5 //client.op 6 6 ModbusIpMaster master = ModbusIpMaster.CreateIp(client); 7 7 //master.op 8 8 // read five input values 9 9 ushort startAddress = 0; 1010 ushort numInputs = 10; 1111 ushort[] inputs = master.ReadInputRegisters(2, startAddress, numInputs); 1212 1313 for (int i = 0; i < numInputs; i++) 1414 { 1515 Console.WriteLine($"Register {(startAddress + i)}={(inputs[i])}"); 1616 } 1717 1818 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

C# Modbus 数据读取 使用NModBus4库 - HelloWorld