2021-09-12 16:54:36 索煒達(dá)電子 745
項(xiàng)目編號:E1123
文件大?。?01K
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
最近周末有點(diǎn)閑時(shí)間,就折磨一下modbus在C#上與MCU或者PLC通訊的事情,小有成果
主要是打包成庫的方式,方便后續(xù)調(diào)用
一、庫對外提供了基礎(chǔ)的函數(shù)功能,平常用的比較多的幾個(gè)
二、ResponseDataBufferMax枚舉類
主要是定義了響應(yīng)幀不同功能碼返回?cái)?shù)據(jù)緩沖區(qū)的大小,目前沒想到更好的辦法,將就用一下
三、FunctionCode枚舉類
定義了常用的幾個(gè)modbus功能碼
四、ExceptionCode枚舉類
定義了響應(yīng)異常幀錯(cuò)誤碼
五、ResponseDecodeRTU對于RTU模式下響應(yīng)幀調(diào)用的API類集合
5.1、public static string ReceiveString
此函數(shù)主要獲取接收的數(shù)據(jù)幀字符串,可以直接顯示到界面的log提示框去
5.2、public static bool ResponseDecodeFinish
此函數(shù)是獲取響應(yīng)幀是否解碼完畢
5.3、public static bool isAbnormal
如果響應(yīng)的是異常幀,此函數(shù)返回true,否則false
5.4、public static string LogMessage
解碼的log信息都在這里了
5.5、public static int ResultCode
獲取解碼函數(shù)的錯(cuò)誤碼
5.6、public static byte FunctionCode
獲取響應(yīng)幀的功能碼
5.7、public static byte DeviceID
獲取響應(yīng)幀的設(shè)備ID
5.8、public static byte ExceptionCode
獲取異常碼,也就是0x8x后面所帶的那個(gè)錯(cuò)誤碼
5.9、public static void WriteCoils(out ushort Register, out ushort Value)
獲取寫單個(gè)線圈響應(yīng)幀數(shù)據(jù)
5.10、public static void WriteHolding(out ushort Register, out ushort Value)
獲取寫單個(gè)保持寄存器響應(yīng)幀數(shù)據(jù)
5.11、public static void WriteMultiCoils(out ushort StartAddress, out ushort OutputNumber)
獲取寫多個(gè)線圈響應(yīng)幀數(shù)據(jù)
5.12、public static void WriteMultiHolding(out ushort StartAddress, out ushort RegisterNumber)
獲取寫多個(gè)保持寄存器響應(yīng)幀數(shù)據(jù)
5.13、public static void ReadCoil(out byte ByteOfCount, out byte[] Status)
獲取讀線圈響應(yīng)幀數(shù)據(jù)
5.14、public static void ReadDiscreteInputs(out byte ByteOfCount, out byte[] Status)
獲取讀離散輸入響應(yīng)幀數(shù)據(jù)
5.15、public static void ReadHolding(out byte ByteOfCount, out byte[] RegisterValue)
獲取讀保持寄存器響應(yīng)幀數(shù)據(jù)
5.16、public static void ReadInput(out byte ByteOfCount, out byte[] RegisterValue)
獲取讀輸入寄存器響應(yīng)幀數(shù)據(jù)
5.17、public static void ReadWriteMultiHolding(out byte ByteOfCount, out byte[] rRegisterValue)
獲取讀寫多個(gè)保持寄存器響應(yīng)幀數(shù)據(jù)
六、TransmitRTU對于RTU模式下發(fā)送數(shù)據(jù)幀類集合
6.1、public static string LogMessage
獲取發(fā)送數(shù)據(jù)log
6.2、public static string TransmitString
獲取發(fā)送數(shù)據(jù)幀字符串
6.3、public static bool TransmitFaild
當(dāng)發(fā)送失敗的時(shí)候,此函數(shù)返回true,否則返回false
6.4、public static bool ReSendFaild
當(dāng)重發(fā)失敗的時(shí)候,此函數(shù)返回true,否則返回false,在發(fā)送的時(shí)候,默認(rèn)有3此重發(fā)機(jī)制,當(dāng)然,重發(fā)次數(shù)可以修改,后面說到
6.5、public static int ReSendCount
設(shè)置重發(fā)次數(shù),建議不低于3次
6.6、public static int ReadCoils(ushort Register, ushort Number)
讀取設(shè)備線圈
6.7、public static int ReadDiscreteInput(ushort Register, ushort Number)
讀取設(shè)備離散輸入
6.8、public static int ReadHolding(ushort Register, ushort Number)
讀取設(shè)備保持寄存器
6.9、public static int ReadInput(ushort Register, ushort Number)
讀取設(shè)備輸入寄存器
6.10、public static int WriteCoils(ushort Register, ushort Data)
寫設(shè)備單個(gè)線圈狀態(tài)
6.11、public static int WriteHolding(ushort Register, ushort Data)
寫設(shè)備單個(gè)保持寄存器
6.12、public static int WriteMultipleCoils(ushort Register, ushort Number, List<byte> Data)
寫設(shè)備多個(gè)線圈狀態(tài)
6.13、public static int WriteMultipleHolding(ushort Register, ushort Number, List<byte> Data)
寫設(shè)備多個(gè)保持寄存器
6.14、public static int ReadWriteMultipleHolding(ushort rRegister, ushort wRegister, ushort rNumber, ushort wNumber, List<byte> Data)
讀寫設(shè)備多個(gè)保持寄存器
七、public static byte DeviceID
配置設(shè)備通訊ID
八、public static int Initializer(byte pDeviceID, string pPortName, int pBaudRate, int pDataBits, StopBits pStopBits, Parity pParity, bool isIndependentReceivingThread)
初始化通訊接口,附帶有一個(gè)線程接收,為true的時(shí)候,單獨(dú)的線程進(jìn)行接收并處理數(shù)據(jù),否則需要在外部調(diào)用接收數(shù)據(jù)處理函數(shù)
九、public static void ThreadServerClose()
在關(guān)閉或者退出程序的時(shí)候,需要調(diào)用此函數(shù)進(jìn)行釋放資源,否則將導(dǎo)致意外的情況發(fā)生
十、public static void ReceiveCallBack()
接收數(shù)據(jù)處理回調(diào)函數(shù),當(dāng)使用獨(dú)立線程進(jìn)行處理的時(shí)候,此函數(shù)不必進(jìn)行調(diào)用,方法見第八點(diǎn)初始化形參配置
十一、public static SerialPort GetSerialPortHandle
獲取串口句柄
十二、其他就是一些關(guān)于串口操作的函數(shù),發(fā)送和接收計(jì)數(shù)獲取等等
路過大神多多指教
附件提供有基礎(chǔ)的測試軟件
【2019-07-12】修改了實(shí)現(xiàn)方式,和舊版本的動(dòng)態(tài)庫操作有所區(qū)別,具體函數(shù)API如下:
1、比較常用的功能碼定義:FunctionCode
2、異常幀(錯(cuò)誤幀)中異常碼定義:ExceptionCode
3、設(shè)置設(shè)備ID:SetDeviceID
4、獲取發(fā)送/接收狀態(tài):GetStatus
5、獲取響應(yīng)幀字符串:GetResponseFrame
6、獲取響應(yīng)幀解碼返回的錯(cuò)誤碼信息:GetResponseResultCode
7、獲取響應(yīng)幀數(shù)據(jù):GetResponseData
8、獲取發(fā)送數(shù)據(jù)幀log信息:GetTransmitLogMessage
9、獲取發(fā)送數(shù)據(jù)幀字符串:GetTransmitFrame
10、設(shè)置重發(fā)次數(shù):SetTransmitReSendCountMax()
11、設(shè)置等待應(yīng)答超時(shí)時(shí)間:SetTransmitWaitResponseTimeOutMax()
12、發(fā)送讀線圈數(shù)據(jù)幀:TransmitReadCoils()
13、發(fā)送讀離散輸入數(shù)據(jù)幀:TransmitReadDiscreteInput()
14、發(fā)送讀保持寄存器數(shù)據(jù)幀:TransmitReadHolding()
15、發(fā)送讀輸入寄存器數(shù)據(jù)幀:TransmitReadInput()
16、發(fā)送寫單個(gè)線圈數(shù)據(jù)幀:TransmitWriteCoils()
17、發(fā)送寫單個(gè)保持寄存器數(shù)據(jù)幀:TransmitWriteHolding()
18、發(fā)送寫多個(gè)線圈數(shù)據(jù)幀:TransmitWriteMultipleCoils()
19、發(fā)送寫多個(gè)保持寄存器數(shù)據(jù)幀:TransmitWriteMultipleHolding()
20、發(fā)送讀寫多個(gè)保持寄存器數(shù)據(jù)幀:TransmitReadWriteMultipleHolding()
21、發(fā)送診斷數(shù)據(jù)幀:TransmitDiagnosis()
22、關(guān)閉串口:CloseSerialPort()
23、控制庫初始化:Initialize()
24、釋放控制庫資源:Dispose()
25、設(shè)置數(shù)據(jù)傳輸線程優(yōu)先級:SetTransmitThreadPriority
26、設(shè)置數(shù)據(jù)傳輸線程是否后臺線程:SetTransmitThreadBackground
27、獲取發(fā)送數(shù)據(jù)字節(jié)計(jì)數(shù):GetTransmitByteCount
28、獲取接收數(shù)據(jù)字節(jié)計(jì)數(shù):GetReceiveByteCount
29、獲取解碼異常碼:GetExceptionCode
30、注冊串口:RegistrationSerialPortControl
31、獲取控制庫版本:GetLibraryVersion
32、讀取數(shù)據(jù)流:Read()
33、寫入數(shù)據(jù)流:Write()
34、獲取寄存器地址:GetRegisterValue
這次增加了診斷函數(shù),受松下A6系列伺服modbus通訊控制啟發(fā)增加的
順便弄了新版的測試軟件,詳見附件
查詢返回?cái)?shù)據(jù)稍微簡單一點(diǎn)
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