资深版主
- 积分
- 12010
- 金钱
- 12010
- 注册时间
- 2013-9-10
- 在线时间
- 427 小时
|
本帖最后由 八度空间 于 2019-7-12 19:03 编辑
最近周末有点闲时间,就折磨一下modbus在C#上与MCU或者PLC通讯的事情,小有成果
主要是打包成库的方式,方便后续调用
一、库对外提供了基础的函数功能,平常用的比较多的几个
二、ResponseDataBufferMax枚举类
主要是定义了响应帧不同功能码返回数据缓冲区的大小,目前没想到更好的办法,将就用一下
三、FunctionCode枚举类
定义了常用的几个modbus功能码
四、ExceptionCode枚举类
定义了响应异常帧错误码
五、ResponseDecodeRTU对于RTU模式下响应帧调用的API类集合
5.1、public static string ReceiveString
此函数主要获取接收的数据帧字符串,可以直接显示到界面的log提示框去
5.2、public static bool ResponseDecodeFinish
此函数是获取响应帧是否解码完毕
5.3、public static bool isAbnormal
如果响应的是异常帧,此函数返回true,否则false
5.4、public static string LogMessage
解码的log信息都在这里了
5.5、public static int ResultCode
获取解码函数的错误码
5.6、public static byte FunctionCode
获取响应帧的功能码
5.7、public static byte DeviceID
获取响应帧的设备ID
5.8、public static byte ExceptionCode
获取异常码,也就是0x8x后面所带的那个错误码
5.9、public static void WriteCoils(out ushort Register, out ushort Value)
获取写单个线圈响应帧数据
5.10、public static void WriteHolding(out ushort Register, out ushort Value)
获取写单个保持寄存器响应帧数据
5.11、public static void WriteMultiCoils(out ushort StartAddress, out ushort OutputNumber)
获取写多个线圈响应帧数据
5.12、public static void WriteMultiHolding(out ushort StartAddress, out ushort RegisterNumber)
获取写多个保持寄存器响应帧数据
5.13、public static void ReadCoil(out byte ByteOfCount, out byte[] Status)
获取读线圈响应帧数据
5.14、public static void ReadDiscreteInputs(out byte ByteOfCount, out byte[] Status)
获取读离散输入响应帧数据
5.15、public static void ReadHolding(out byte ByteOfCount, out byte[] RegisterValue)
获取读保持寄存器响应帧数据
5.16、public static void ReadInput(out byte ByteOfCount, out byte[] RegisterValue)
获取读输入寄存器响应帧数据
5.17、public static void ReadWriteMultiHolding(out byte ByteOfCount, out byte[] rRegisterValue)
获取读写多个保持寄存器响应帧数据
六、TransmitRTU对于RTU模式下发送数据帧类集合
6.1、public static string LogMessage
获取发送数据log
6.2、public static string TransmitString
获取发送数据帧字符串
6.3、public static bool TransmitFaild
当发送失败的时候,此函数返回true,否则返回false
6.4、public static bool ReSendFaild
当重发失败的时候,此函数返回true,否则返回false,在发送的时候,默认有3此重发机制,当然,重发次数可以修改,后面说到
6.5、public static int ReSendCount
设置重发次数,建议不低于3次
6.6、public static int ReadCoils(ushort Register, ushort Number)
读取设备线圈
6.7、public static int ReadDiscreteInput(ushort Register, ushort Number)
读取设备离散输入
6.8、public static int ReadHolding(ushort Register, ushort Number)
读取设备保持寄存器
6.9、public static int ReadInput(ushort Register, ushort Number)
读取设备输入寄存器
6.10、public static int WriteCoils(ushort Register, ushort Data)
写设备单个线圈状态
6.11、public static int WriteHolding(ushort Register, ushort Data)
写设备单个保持寄存器
6.12、public static int WriteMultipleCoils(ushort Register, ushort Number, List<byte> Data)
写设备多个线圈状态
6.13、public static int WriteMultipleHolding(ushort Register, ushort Number, List<byte> Data)
写设备多个保持寄存器
6.14、public static int ReadWriteMultipleHolding(ushort rRegister, ushort wRegister, ushort rNumber, ushort wNumber, List<byte> Data)
读写设备多个保持寄存器
七、public static byte DeviceID
配置设备通讯ID
八、public static int Initializer(byte pDeviceID, string pPortName, int pBaudRate, int pDataBits, StopBits pStopBits, Parity pParity, bool isIndependentReceivingThread)
初始化通讯接口,附带有一个线程接收,为true的时候,单独的线程进行接收并处理数据,否则需要在外部调用接收数据处理函数
九、public static void ThreadServerClose()
在关闭或者退出程序的时候,需要调用此函数进行释放资源,否则将导致意外的情况发生
十、public static void ReceiveCallBack()
接收数据处理回调函数,当使用独立线程进行处理的时候,此函数不必进行调用,方法见第八点初始化形参配置
十一、public static SerialPort GetSerialPortHandle
获取串口句柄
十二、其他就是一些关于串口操作的函数,发送和接收计数获取等等
路过大神多多指教
附件提供有基础的测试软件
【2019-07-12】修改了实现方式,和旧版本的动态库操作有所区别,具体函数API如下:
1、比较常用的功能码定义:FunctionCode
2、异常帧(错误帧)中异常码定义:ExceptionCode
3、设置设备ID:SetDeviceID
4、获取发送/接收状态:GetStatus
5、获取响应帧字符串:GetResponseFrame
6、获取响应帧解码返回的错误码信息:GetResponseResultCode
7、获取响应帧数据:GetResponseData
8、获取发送数据帧log信息:GetTransmitLogMessage
9、获取发送数据帧字符串:GetTransmitFrame
10、设置重发次数:SetTransmitReSendCountMax()
11、设置等待应答超时时间:SetTransmitWaitResponseTimeOutMax()
12、发送读线圈数据帧:TransmitReadCoils()
13、发送读离散输入数据帧:TransmitReadDiscreteInput()
14、发送读保持寄存器数据帧:TransmitReadHolding()
15、发送读输入寄存器数据帧:TransmitReadInput()
16、发送写单个线圈数据帧:TransmitWriteCoils()
17、发送写单个保持寄存器数据帧:TransmitWriteHolding()
18、发送写多个线圈数据帧:TransmitWriteMultipleCoils()
19、发送写多个保持寄存器数据帧:TransmitWriteMultipleHolding()
20、发送读写多个保持寄存器数据帧:TransmitReadWriteMultipleHolding()
21、发送诊断数据帧:TransmitDiagnosis()
22、关闭串口:CloseSerialPort()
23、控制库初始化:Initialize()
24、释放控制库资源:Dispose()
25、设置数据传输线程优先级:SetTransmitThreadPriority
26、设置数据传输线程是否后台线程:SetTransmitThreadBackground
27、获取发送数据字节计数:GetTransmitByteCount
28、获取接收数据字节计数:GetReceiveByteCount
29、获取解码异常码:GetExceptionCode
30、注册串口:RegistrationSerialPortControl
31、获取控制库版本:GetLibraryVersion
32、读取数据流:Read()
33、写入数据流:Write()
34、获取寄存器地址:GetRegisterValue
这次增加了诊断函数,受松下A6系列伺服modbus通讯控制启发增加的
顺便弄了新版的测试软件,详见附件
查询返回数据稍微简单一点
- res = mbLib.GetStatus(out err);
- if (res == 0)
- {
- this.Invoke(new Action(() =>
- {
- modbus_ResponseBytesThreadHandler(err);
- }));
- isStartScanFlag = false;
- }
复制代码 附件压缩包ModbusTest_V1.0-1.zip中动态库文件dll,readme.txt说明文件
|
|