【E1123】C#搞的Modbus主机库【更新库实现方式】

2021-09-12 16:54:36      索炜达电子      513     

项目编号:E1123

文件大小:701K

源码说明:带中文注释

开发环境:C编译器

简要概述:

最近周末有点闲时间,就折磨一下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;

                    }

目录│文件列表:

 │ ModbusLibrary.zip

 │ ModbusLibraryTest V1.0-2.zip

 └ ModbusTest_V1.0-1.zip

TAGModbus
  • 6 次
  • 1 分