modbus通讯协议软件包
Modbus 通讯协议编程(VB源代码)

最近,本人为了实现电脑与Delta V FD-M变频器通讯,特意用VB6.0编了一个Modbus协议通讯软件。
这只是一个测试版,但Modbus的ASCII协议和RTU协议都已经实现。
现在将源程序上传,希望可以帮助到有需要的朋友,谢谢!另外,假如你觉得有更好的想法,欢迎指教。
如果对本程序有任何意见和建议,也可以一起讨论,共同进步。
大家多多支持俺啊。
附:VB6源程序Option ExplicitPrivate Text1text As StringPrivate RTUCRC As String'串口选择Private Sub Combo1_Click()mPort = Combo1.ListIndex + 1End Sub'数据位改变< span style="color: #008000;">Private Sub Combo2_Click()Call settingEnd Sub'波特率改变< span style="color: #008000;">Private Sub Combo3_Click()Call settingEnd Sub'奇偶校验改变< span style="color: #008000;">Private Sub Combo4_Click()Call settingEnd Sub'停止位改变< span style="color: #008000;">Private Sub Combo5_Click()Call settingPrivate Sub setting()MSComm1.Settings = CStr(Combo3.Text) & ","& CStr(Combo4.Text) & ","& CStr(C ombo2.Text) _& ","& CStr(Combo5.Text)End Sub'打开关闭串口< span style="color: #008000;">Private Sub Command1_Click()On Error Resume NextIf MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueElseMSComm1.PortOpen = FalseEnd IfIf MSComm1.PortOpen Then'打开关闭按钮显示文字及combo1使能Command1.Caption = "关闭串口"Combo1.Enabled = FalseElseCommand1.Caption = "打开串口"Combo1.Enabled = TrueEnd IfIf Err Then'打开串口失败,则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd Sub'10转16进制< span style="color: #008000;">Private Sub Command2_Click(Index As Integer)On Error Resume NextText4.Text = Hex(Text3.Text)If Err Then''则显示出错信息< span style="color: #008000;">MsgBox Error$, 48, "错误信息"Exit SubEnd If'16转10进制< span style="color: #008000;">Private Sub Command3_Click()Dim a As Longa = Val("&H"& CStr(Text4.Text))Text3.Text = aEnd Sub'手动串口发送< span style="color: #008000;">Private Sub Command4_Click()If MSComm1.PortOpen = False ThenMsgBox"请先打开串口< span style="color: #800000;">", , "错误信息" Exit SubEnd IfCall sentsubEnd Sub'清除接收窗< span style="color: #008000;">Private Sub Command5_Click()Text2.Text = ""End SubPrivate Sub Command6_Click()Unload MeEnd SubPrivate Sub Command7_Click()On Error Resume NextDim STP As StringSTP = CStr(Chr(2)) & "010001"& CStr(Chr(3)) & "25"MSComm1.Settings = "9600,N,7,2"MSComm1.PortOpen = TrueMSComm1.Output = STPMSComm1.PortOpen = FalseIf Err Then'打开串口失败,则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd SubPrivate Sub Command8_Click()On Error Resume NextDim FWD As StringFWD = CStr(Chr(2)) & "010101"& CStr(Chr(3)) & "26" MSComm1.Settings = "9600,N,7,2"MSComm1.PortOpen = TrueMSComm1.Output = FWDMSComm1.PortOpen = FalseIf Err Then'打开串口失败,则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd SubPrivate Sub Command9_Click()On Error Resume NextDim REV As StringREV = CStr(Chr(2)) & "010201"& CStr(Chr(3)) & "27" MSComm1.Settings = "9600,N,7,2"MSComm1.PortOpen = TrueMSComm1.Output = REVMSComm1.PortOpen = FalseIf Err Then'打开串口失败,则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd Sub'窗口加载Private Sub Form_Load()Dim d%For d = 1To16Combo1.AddItem ("COM"& CStr(d))NextCombo1.ListIndex = 0Combo2.AddItem "6"Combo2.AddItem "7"Combo2.AddItem "8"Combo2.ListIndex = 2Combo3.AddItem "110" Combo3.AddItem "330" Combo3.AddItem "1200" Combo3.AddItem "2400" Combo3.AddItem "4800" Combo3.AddItem "9600" Combo3.AddItem "19200" Combo3.AddItem "38400" Combo3.AddItem "56000" Combo3.AddItem "57600" Combo3.AddItem "115200" Combo3.ListIndex = 5Combo4.AddItem "n" Combo4.AddItem "o" Combo4.AddItem "e" Combo4.ListIndex = 0Combo5.AddItem "1" Combo5.AddItem "2" Combo5.ListIndex = 0For d = 0To254Combo6.AddItem dNextCombo6.ListIndex = 1Text1.Text = "010*********" Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = "1000"Text6.Text = "06"Text7.Text = "0"Text8.Text = "1"Option1.value = TrueOption3.value = TrueOption7.value = TrueOption9.value = TrueIf MSComm1.PortOpen = False ThenCommand1.Caption = "打开串口"ElseCommand1.Caption = "关闭串口"End IfEnd Sub'串口接收程序< span style="color: #008000;">Private Sub MSComm1_OnComm()Dim Hexchr As String, hexstring As String, i As Integer, j As Integer, hexdisp As Str ingIf Option8.value Thenhexstring = MSComm1.Input '十六进制显示< span style="color: #008000;">i = Len(hexstring)For j = 1To iHexchr = Mid(hexstring, j, 1)If Hex(Asc(Hexchr)) < 16ThenText2.Text = Text2.Text & "0"& Hex(Asc(Hexchr)) & " "ElseText2.Text = Text2.Text & Hex(Asc(Hexchr)) & " "End IfNext jText2.Text = Text2.Text & CStr(Chr(13)) & CStr(Chr(10))ElseText2.Text = Text2.Text & MSComm1.Input & CStr(Chr(13)) & CStr(Chr(10)) 'ASCII 码显示< span style="color: #008000;">End IfEnd Sub'手动发送选择< span style="color: #008000;">Private Sub Option1_Click()If Option1.value = True ThenTimer1.Enabled = FalseCommand4.Enabled = TrueElseTimer1.Enabled = TrueCommand4.Enabled = FalseEnd IfEnd Sub'Delta ASCII发送协议Private Sub Option10_Click()Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseOption7.Enabled = FalseOption11.value = TrueCombo2.ListIndex = 1Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseFrame7.Visible = TrueEnd Sub'自动发送选择< span style="color: #008000;"> Private Sub Option2_Click()If Option2.value = True ThenTimer1.Enabled = TrueCommand4.Enabled = FalseElseTimer1.Enabled = FalseCommand4.Enabled = TrueEnd IfEnd SubPrivate Sub Option3_Click() 'Non选项< span style="color: #008000;"> Combo6.Enabled = FalseText6.Enabled = FalseText7.Enabled = FalseText8.Enabled = FalseLabel10.Enabled = FalseLabel11.Enabled = FalseLabel12.Enabled = FalseLabel13.Enabled = FalseOption6.Enabled = TrueOption7.Enabled = TrueCombo2.ListIndex = 2Combo5.ListIndex = 0Text1.Enabled = TrueLabel14.Enabled = TrueFrame7.Visible = FalseEnd SubPrivate Sub Option4_Click() 'ASCII选项< span style="color: #008000;"> Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseOption7.Enabled = FalseCombo2.ListIndex = 1Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseFrame7.Visible = FalseEnd SubPrivate Sub Option5_Click() 'RTU选项< span style="color: #008000;"> Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseOption7.Enabled = FalseCombo2.ListIndex = 2Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseFrame7.Visible = FalseEnd Sub'发送时间间隔调整输入< span style="color: #008000;">Private Sub Text5_Change()Dim number As StringDim num As IntegerDim numcyc As Integernum = Len(Text5.Text)For numcyc = 1To numnumber = Mid(Text5.Text, numcyc, 1)Select Case InStr("0123456789", number)Case0MsgBox"输入时间间隔错误,请重新输入", , "错误信息"Exit SubEnd SelectNextTimer1.Interval = Text5.TextEnd Sub'自动发送定时器< span style="color: #008000;">Private Sub Timer1_Timer()If MSComm1.PortOpen ThenCall sentsubEnd IfEnd Sub'状态刷新定时器< span style="color: #008000;">Private Sub Timer2_Timer()StatusBar1.Panels(1).Text = "串口选择:< span style="color: #800000;">" & CStr(Comb o1.Text)StatusBar1.Panels(2).Text = "串口设置:< span style="color: #800000;">" & CStr(MSC omm1.Settings)StatusBar1.Panels(3).Text = "串口状态:< span style="color: #800000;">" & CStr(MSC omm1.PortOpen)End Sub'串口发送子程序Private Sub sentsub()Dim optioncase%If Option3.value Then optioncase = 1If Option4.value Then optioncase = 2If Option5.value Then optioncase = 3If Option10.value Then optioncase = 4Select Case optioncaseCase1If Option6.value ThenText1text = Text1.TextCall HexsentElseText1text = Text1.TextCall ASCIIsentEnd IfCase2Call incorporate '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call ASCIIcheckCall ASCIIsentCase3Call incorporate '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call RTUcheckCall HexsentCase4Call incorporate1 '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call deltaASCIICall ASCIIsentEnd SelectEnd Sub'十六进制发送< span style="color: #008000;">Private Sub Hexsent()Dim hexchrlen%, Hexchr As String, hexcyc%, hexmid As Byte, hexmiddle As String Dim hexchrgroup() As Byte, i As Integerhexchrlen = Len(Text1text)For hexcyc = 1To hexchrlen '检查Text1文本框内数值是否合适Hexchr = Mid(Text1text, hexcyc, 1)If InStr("0123456789ABCDEFabcdef", Hexchr) = 0ThenMsgBox"无效的数值,请重新输入< span style="color: #800000;">", , "错误信息" Exit SubEnd IfNextReDim hexchrgroup(1To hexchrlen \ 2) As ByteFor hexcyc = 1To hexchrlen Step2'将文本框内数值分成两个、两个i = i + 1Hexchr = Mid(Text1text, hexcyc, 2)hexmid = Val("&H"& CStr(Hexchr))hexchrgroup(i) = hexmid'MSComm1.Output = CStr(hexmid)NextMSComm1.Output = hexchrgroupEnd Sub'ASC码发送< span style="color: #008000;">Private Sub ASCIIsent()MSComm1.Output = Text1textEnd Sub'ASC校验,此段程序计算出LRC校验值,并加上字头和字尾Private Sub ASCIIcheck()Dim a%, b%, chrnum%, Lrcbyte As StringDim checksum%, char%, AscLrc%, Lrc%chrnum = Len(Text1text)For a = 1To chrnum Step2char= Val("&H"& CStr(Mid(Text1text, a, 2))) '两个两个的取字符< span style="color: #008000;">checksum = checksum + char'全部加起来< span style="color: #008000;">NextAscLrc = checksum Mod&H100 '取255的余数< span style="color: #008000;">Lrc = (&HFF - AscLrc) + 1'取二次补If Lrc < 16Then'此段程序是判断Hex(lrc)是否是一位数,Lrcbyte = "0"+ CStr(Hex(Lrc)) '如果是的话,前面加0;否则不加零ElseLrcbyte = CStr(Hex(Lrc))End IfText1text = CStr(Chr(58)) & CStr(Text1text) & Lrcbyte & CStr(Chr(13)) & CStr(Chr(1 0))End Sub'DeltaASCII校验,此段程序计算出LRC校验值,并加上字头和字尾Private Sub deltaASCII()Dim a%, b%, chrnum%, Lrcbyte As StringDim checksum%, char%, Lrc%chrnum = Len(Text1text)For a = 1To chrnumchar= Asc(Mid(Text1text, a, 1)) '两个两个的取字符< span style="color: #008000;"> checksum = checksum + char'全部加起来< span style="color: #008000;">NextLrc = (checksum + &H3) Mod&H100 '取255的余数< span style="color: #008000;"> If Lrc < 16Then'此段程序是判断Hex(lrc)是否是一位数,Lrcbyte = "0"+ CStr(Hex(Lrc)) '如果是的话,前面加0;否则不加零ElseLrcbyte = CStr(Hex(Lrc))End IfText1text = CStr(Chr(2)) & CStr(Text1text) & CStr(Chr(3)) & LrcbyteEnd Sub'RTU校验< span style="color: #008000;">Private Sub RTUcheck()Dim CRC() As ByteDim d(5) As ByteDim string1 As StringDim j As Integer, chrlength As Integer, temp As Stringstring1 = Text1textchrlength = Len(string1)For j = 0To chrlength / 2- 1temp = Mid(string1, j * 2+ 1, 2)d(j) = Val("&H"& temp)NextRTUCRC = CRC16(d) '调用CRC16计算函数, CRC(0)为高位, CRC(1)为低位Text1text = Text1text & RTUCRCEnd SubPrivate Sub incorporate() '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Dim wholechar As String, wc%, wcyc%, wchar As StringDim SID As String, Cmd As String, InfoAdd As String, data As StringDim SIDnum%, Cmdnum%, InfoAddNum%, Datanum%On Error Resume Nextwholechar = CStr(Combo6.Text) & CStr(Text6.Text) & CStr(Text7.Text) & CStr(Text8.T ext)wc = Len(wholechar)For wcyc = 1To wcwchar = Mid(wholechar, wcyc, 1)If InStr("0123456789", wchar) = 0ThenMsgBox"输入错误,请重新输入< span style="color: #800000;">", , "错误提示"Exit SubEnd IfNextSIDnum = Len(CStr(Hex(Combo6.Text)))Select Case SIDnumExit SubCase1SID = "0"& CStr(Hex(Combo6.Text)) Case2SID = CStr(Hex(Combo6.Text))End SelectCmdnum = Len(CStr(Hex(Text6.Text))) Select Case CmdnumCase0Exit SubCase1Cmd = "0"& CStr(Hex(Text6.Text)) Case1Cmd = CStr(Hex(Text6.Text))End SelectInfoAddNum = Len(CStr(Hex(Text7.Text))) Select Case InfoAddNumCase0Exit SubCase1InfoAdd = "000"& CStr(Hex(Text7.Text)) Case2InfoAdd = "00"& CStr(Hex(Text7.Text)) Case3InfoAdd = "0"& CStr(Hex(Text7.Text)) Case4InfoAdd = CStr(Hex(Text7.Text))End SelectDatanum = Len(CStr(Hex(Text8.Text))) Select Case DatanumCase0Exit Subdata = "000"& CStr(Hex(Text8.Text))Case2data = "00"& CStr(Hex(Text8.Text))Case3data = "0"& CStr(Hex(Text8.Text))Case4data = CStr(Hex(Text8.Text))End SelectIf Err Then'显示出错信息< span style="color: #008000;">MsgBox Error$, 48, "错误信息"Exit SubEnd IfText1text = CStr(SID) & CStr(Cmd) & CStr(InfoAdd) & CStr(data)End SubPrivate Sub incorporate1() '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Dim wholechar As String, wc%, wcyc%, wchar As StringDim SID As String, Cmd As String, InfoAdd As String, data As StringDim SIDnum%, Cmdnum%, InfoAddNum%, Datanum%On Error Resume Nextwholechar = CStr(Combo6.Text) & CStr(Text7.Text) & CStr(Text8.Text)wc = Len(wholechar)For wcyc = 1To wcwchar = Mid(wholechar, wcyc, 1)If InStr("0123456789", wchar) = 0ThenMsgBox"输入错误,请重新输入< span style="color: #800000;">", , "错误提示"Exit SubEnd IfNextSIDnum = Len(CStr(Hex(Combo6.Text)))Select Case SIDnumCase0Case1SID = "0"& CStr(Hex(Combo6.Text)) Case2SID = CStr(Hex(Combo6.Text))End Select'Cmdnum = Len(CStr(Hex(Text6.Text)))'Select Case Cmdnum'Case 0' Exit Sub'Case 1' Cmd = "0" & CStr(Hex(Text6.Text))'Case 1' Cmd = CStr(Hex(Text6.Text))'End SelectInfoAddNum = Len(CStr(Hex(Text7.Text))) Select Case InfoAddNumCase0Exit SubCase1InfoAdd = "0"& CStr(Hex(Text7.Text)) Case2InfoAdd = CStr(Hex(Text7.Text))End SelectDatanum = Len(CStr(Hex(Text8.Text))) Select Case DatanumCase0Exit SubCase1data = "000"& CStr(Hex(Text8.Text)) Case2data = "00"& CStr(Hex(Text8.Text)) Case3data = "0"& CStr(Hex(Text8.Text))Case4data = CStr(Hex(Text8.Text))End SelectIf Err Then'显示出错信息< span style="color: #008000;">MsgBox Error$, 48, "错误信息"Exit SubEnd IfIf Option11.value ThenCmd = "08"Text1text = CStr(SID) & CStr(Cmd) & CStr(InfoAdd)ElseCmd = "07"Text1text = CStr(SID) & CStr(Cmd) & CStr(InfoAdd) & CStr(data)End IfEnd SubPrivate Function CRC16(data() As Byte) As StringDim CRC16Lo As Byte, CRC16Hi As Byte'CRC寄存器< span style="color: #00800 0;">Dim CL As Byte, CH As Byte'多项式码&HA001Dim CRCLo As String, CRCHi As StringDim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For i = 0To UBound(data)CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或For Flag = 0To7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2'高位右移一位< span style="color: #008000;">CRC16Lo = CRC16Lo \ 2'低位右移一位< span style="color: #008000;">If((SaveHi And&H1) = &H1) Then'如果高位字节最后一位为1< span style="color: #008000;">CRC16Lo = CRC16Lo Or&H80 '则低位字节右移后前面补1< span style="color: #008 000;">End If'否则自动补0< span style="color: #008000;">If((SaveLo And&H1) = &H1) Then'如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iIf Len(Hex(CRC16Hi)) = 1ThenCRCHi = "0"+ Hex(CRC16Hi)ElseCRCHi = Hex(CRC16Hi)End IfIf Len(Hex(CRC16Lo)) = 1ThenCRCLo = "0"+ Hex(CRC16Lo)ElseCRCLo = Hex(CRC16Lo)End IfCRC16 = CRCLo + CRCHiEnd Function。
modbus通讯协议粘包

modbus通讯协议粘包
Modbus通讯协议粘包是指在Modbus通信过程中,由于数据
包的长度和发送间隔等因素,导致两个或多个数据包粘在一起,无法正确解析和处理的现象。
在Modbus通信中,通常使用串行通信方式,每个数据包包含
一个起始符、地址、功能码、数据、校验等字段。
当数据包的长度较短或发送间隔较短时,由于通信的延迟等原因,接收方可能会把多个数据包当作一个整体接收,从而造成粘包现象。
粘包问题主要有两种情况:
1. 多个数据包粘在一起:在接收方无法正确解析多个数据包的边界,导致将多个数据包当作一个整体进行处理。
2. 数据包部分粘在一起:在接收方只接收了部分数据包的内容,导致无法正确解析和处理数据。
为了解决Modbus通讯协议粘包问题,可以采取以下一些方法:1. 增加帧结束符:可以在每个数据包的末尾增加一个特定的帧结束符,接收方根据该帧结束符来判断数据包的边界。
2. 增加数据包长度字段:可以在每个数据包中增加一个长度字段,接收方根据该长度字段来判断每个数据包的边界。
3. 规定固定长度的数据包:可以通过规定每个数据包的固定长度,接收方根据固定长度来判断数据包的边界。
4. 增加时间间隔:可以在每个数据包的发送之间增加适当的时间间隔,以避免数据包粘连在一起。
根据具体情况,可以选择其中一种或多种方法来解决Modbus 通讯协议粘包问题。
Modbus RTU通讯协议

要实现Modbus RTU通信,一、需要STEP 7-Micro/WIN32 V3.2以上版本的编程软件,而且须安装STEP 7-Micro/WIN32 V3.2 Instruction Library(指令库)。
Modbus RTU功能是通过指令库中预先编好的程序功能块实现的。
Modbus RTU从站指令库只支持CPU上的通信0口(Port0)基本步骤:1. 检查Micro/WIN的软件版本,应当是STEP 7-Micro/WIN V3.2以上版本。
2. 检查Micro/WIN的指令树中是否存在Modbus RTU从站指令库(图1),库中应当包括MBUS_INIT和MBUS_SLAVE两个子程序。
如果没有,须安装Micro/WIN32 V3.2的Instruction Library(指令库)软件包;1. 西门子编程时使用SM0.1调用子程序MBUS_INIT进行初始化,使用SM0.0调用MBUS_SLAVE,并指定相应参数。
关于参数的详细说明,可在子程序的局部变量表中找到;调用Modbus RTU通信指令库图中参数意义如下:a. 模式选择:启动/停止Modbus,1=启动;0=停止b. 从站地址:Modbus从站地址,取值1~247c. 波特率:可选1200,2400,4800,9600,19200,38400,57600,115200d. 奇偶校验:0=无校验;1=奇校验;2=偶校验e. 延时:附加字符间延时,缺省值为0f. 最大I/Q位:参与通信的最大I/O点数,S7-200的I/O映像区为128/128,缺省值为128g. 最大AI字数:参与通信的最大AI通道数,可为16或32h. 最大保持寄存器区:参与通信的V存储区字(VW)i. 保持寄存器区起始地址:以&VBx指定(间接寻址方式)j. 初始化完成标志:成功初始化后置1k. 初始化错误代码l. Modbus执行:通信中时置1,无Modbus 通信活动时为0。
宇电AIBUS及MODBUS通讯协议说明V80-补充版

宇电AIBUS及MODBUS通讯协议说明(V8.0)AIBUS是厦门宇电自动化科技有限公司为AI系列显示控制仪表开发的通讯协议,能用简单的指令实现全面的功能,其特点是写参数的同时亦可完成读功能,因此写参数时不破坏读的循环周期时间,加上指令长度较少,因此具有比MODBUS更快的速率(尤其是有写入指令时,MODBUS的写入指令不能同时完成读下位机数据的功能,会破坏读指令的周期,延长了读的循环周期),AIBUS协议具有组建大规模过程控制系统能力。
AIBUS采用了16位的求和校正码,下位机运算快速且通讯可靠,支持9600和19200等不同波特率,在19200波特率下,上位机访问一台AI-7/8系列高性能仪表的平均时间仅20mS,访问AI-5系列仪表的平均时间为40mS。
仪表允许在一个RS485通讯接口上连接多达80台仪表(为保证通讯可靠,仪表数量大于60台时需要加一个RS485中继器)。
AI系列仪表可以用PC、触摸屏及PLC作为上位机,其软件资源丰富,发展速度极快。
基与PC的上位机软件广泛采用WINDOWS作为操作环境,不仅操作直观方便,而且功能强大。
最新的工业平板触摸屏式PC的应用,更为工业自动化带来新的界面。
这使得采用仪表+上位机结构的测控系统价格大大低于传统DCS系统,而性能及可靠性也具备比传统DCS系统更优越的潜力。
宇电AI-5系列仪表写入寿命可达100万次,而AI-7/8系列仪表则允许连续写参数,如写给定值或输出值,写入寿命高达10亿次,可利用上位机将仪表组成复杂调节系统。
一、接口规格AI系列仪表使用异步串行通讯接口,接口电平符合RS232C或RS485标准中的规定。
数据格式为1个起始位,8位数据,无校验位,1个或2个停止位。
通讯传输数据的波特率可调为4800~19200 bit/S,通常用9600 bit/S,单一通讯口所连接仪表数量大于40台或需要更快刷新率时,推荐用19200bit/S,当通讯距离很长或通讯不可靠常中断时,可选4800bit/S。
Modbus协议调试软件工具MThings仿真演示教程

Modbus协议调试软件工具MThings仿真演示教程市面上有不少的Modbus协议调试工具,今天介绍一款MThings 高度集成的Modbus协议调试工具,该工具可以仿真从机也可以仿真主机,与市面上常见的主机和从机分离软件不同,支持免安装运行,同时也支持安装运行,支持多种Modbus协议(Modbus RTU、Modbus ASCII、Modbus TCP等),支持配置文件导入导出,内置多种数据转换功能,支持丢包率、收发延迟等数据统计,支持多台仿真设备同时配置运行。
前文我们介绍了modbus协议调试工具软件功能,本文接着将利用该调试软件Modbus RTU、Modbus ASCII、Modbus TCP协议的仿真演示教程。
具体教程如下:1、Modbus TCP协议没有连接的可以“新增网络链接”(1),也可以通过“配置”(2)修改现有的链接,新创建的链接也要通过配置修改网络参数,这里主机配置为服务器模式(3),选择Modbus TCP协议(4),配置服务器端口(5),配置客户端IP(6,必须配置,非此IP连接服务器会拒绝连接),配置模拟设备属性为“Modbus主机”;预配置主机方法类似,主机使用了服务器模式从机就必须采用客户端模式,配置目标IP和目标端口为主机所开的服务器IP与端口,置模拟设备属性为“Modbus从机”,一般情况都是从机作为服务器,方便接入多个HMI和SCADA软件控制采集PLC,这里没有采用这种模式,但软件支持对应调整模式即可;从机添加控制点位,主机只能读取已仿真的寄存器点位否则会报错,之前已经说明了寄存器添加这里不再重复,通讯效果如下图:2、Modbus RTU协议演示Modbus RTU设备属性配置如下:演示如下:3、Modbus ASCII协议演示Modbus ASCII设备属性配置如下:演示如下:。
M系列RS485采集模块与组态王V6.55软件进行Modbus RTU通讯

M系列RS485采集模块与组态王V6.55软件通讯
M系列RS485采集模块是基于RS485网络的数字量和模拟量采集模块,支持工业标准的Modbus RTU 协议,包括:M-IB16 (16路数字量输入模块)、M-OB16(16路数字量输出模块)、M-IF16C(16路模拟量输入模块)、M-OF8C(8路模拟量输出),可以与组态王、力控以及支持Modbus RTU协议的PLC等系统联合使用,下面以M系列RS485采集模块与组态王进行通讯为例。
1、启动组态王工程管理器,输入工程名称、路径、描述等。
2、设置组态王串口参数:波特率、数据位、停止位、奇偶校验、通讯超时、通讯方式。
3、在组态王中新建设备驱动,选择设备驱动\PLC\莫迪康\ModbusRTU\COM,设置设备名称、串口号、设备地址、通讯参数。
4、在数据词典中定义变量,输入变量名、变量类型、连接设备、寄存器、数据类型、读写属性、采样频率。
M-IB16的16路数字量输入I0~I15分别对应到寄存器100001~100016,通过02号功能码进行读取:
M-OB16的16路数字量输出Q0~Q15分别对应寄存器000001~000016,通过05号功能码进行写入操作:
5、在组态王中进行画面设计
6、运行画面,可以看到M-IB16的I0~I14为1,I15为0,通过上部的开关按钮控制M-OB16的输出,Q0~Q5为1,Q6~Q15为0。
Growatt PV Inverter Modbus RS485 RTU Protocol V3.11--中文客户版

格瑞特光伏逆变器Modbus RS485 协议V3.112015-04-01格瑞特新能源有限公司V2.01 2011-11-2:1、修正了寄存器Map表2、增加了最大数据长度定义3、改变了RS232的相等模式V2.02 2011-11-4:1、增加了烧录命令V2.03 2012-03-011、融合了读和写的寄存器表2、修改了4.1和4.2的寄存器表V2.04 2012-03-051、增加了读写命令系统时间V2.05 2012-03-061、增加了电网V/F保护时间的读写命令V2.06 2012-03-211、增加了自动测试命令2、移动厂商信息从13到60V2.07 2012-04-191、增加了holding寄存器:13~15, 40~45, 68~71, 73, 74;V2.08 2012-04-281、替换了所有寄存器地址,开始地址为0x0000V2.09 2012-05-091、增加4-45PF寄存器,为了读和校正PF2、增加了3-90~99寄存器,为了设置PF曲线(此功能为内部预留)V2.10 2012-05-101、为了记录50组错误信息,增加了4-180~429寄存器V2.11 2012-05-291、为了频率-负载斜率和PF检测校正值,增加了3-1,100~107寄存器2、改变了输出寄存器单位,从W变为VAV2.12 2012-06-141、改变了3-3寄存器的定义2、改变了3-90~99寄存器器,改变PF曲线定义;3、增加了3-155~158电网调度命令密码寄存器V2.13 2012-06-271、增加了3-99寄存器,增加了3-108~112V2.14 2012-07-171、增加了3-74逆变器选择命令,和3-98的CEI频率测试命令2、增加了3-80~89,4-80~89预留寄存器V2.15 V2.16 2012-07-311、增加了4-48~63 PV电量,无功功率和电量寄存器V3.00 2012-08-151、增加了3-113~115寄存器,为了CEI021模式设置2、增加4-48~63寄存器,PV电量和无功电量3、增加了4-450~575寄存器,为了历史电量的记录V3.01 2012-11-22:1、增加了3-75 232转485使能2、增加3-116~1193、增加了4-47降载模式4、增加其他寄存器V3.02 2013-01-26:1、在holding寄存器表中,增加而来功率控制寄存器;2、在input表中,增加了预留寄存器3、改变了24小时发电量涵义4、注意最小的CMD周期V3.03 2013-01-30:1、改变了485指令周期V3.06 2015-03-09:1, 增加Holding192寄存器取使/失能N到地检测2, 增加Holding193寄存器使能设置V3.07 2015-05-22:1, 增加Holding165寄存器作为Q(V)激活延时时间2, 增加Holding寄存器166作为过频延时时间V3.10 2015-12-17:1, 增加组串监控寄存器Input70~89,包括电流电压故障等信息。
TCU(Modbus通讯协议)

第一章总论1.1 概述Modbus总线用于将TCU系列控制器连接到具备Modbus总线通道的远程监控系统或其它终端设备上。
这时,TCU列控制器总是作为从机。
Modbus总线还用于将其它具备Modbus总线通道的终端设备连接到TCU系列控制器中,此时,TCU系列总是作为主机。
TCU系列提供了2个独立的通讯接口,COM1和COM2口,但是只提供了一个RS-232接口,其它的作为RS485接口。
★ RS485二线网络接口。
★ RS232 三线网络接口。
(RXD、TXD、GND)具体连接方式参见第三章物理连接。
1.2 有效数据访问⑴上行数据遥测信息遥信信息⑵下行数据遥控信息设定参数1.3 访问模式RS232接口允许双向操作。
如果采用RS485接口仅支持单向操作。
采用该协议时建议用户使用RS232接口,否则会出现数据接收错误。
循环时间:下行循环指令最短时间必须大于10S。
1第二章 Modbus总线协议功能概述2.1 协议操作Modbus总线用于在一个主机与一个或多个从机之间进行数据交换,执行请求,应答对话,请求总是由主机发起的。
从机由地址编码进行识别。
Modbus以RTU模式存在。
数据以16Bit字或1Bit格式进行交换。
每个信息都有一个16位地址(字或位)。
2.2 协议功能TCU系列控制器使用的是RTU Modbus总线协议。
以下TCU系列的可执行功能:2.2.1 基本功能表一:基本功能注:功能码0x55和0x66不支持基本型的TCU产品,它仅仅是预留的扩展功能。
2.2.2 异常功能从机在接收到命令且校验正确时,会返回表二的错误功能。
2.2.3 以下情况从机不响应发生通讯故障时,从机无法接收到命令,从机不响应,由主机以超时来判断错误。
从机收到命令,但检测到错误(奇偶校验错误、CRC校验错误)时,从设备不响应,也由主机以超时来判断错误。
表二:错误代码22.2.4 TCU系列不支持多主机操作。
2.2.5 安全功能功能码:66H不支持基本型的TCU产品,它仅仅是预留的扩展功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ModBus通讯协议软件包
ModBus 通讯协议简介
是一种已广泛应用于当今工业控制领域的通用通讯协议。
通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。
使用的是主从通讯技术,即由主设备主动查询和操作从设备。
一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。
典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。
Modbus通讯物理接口可以选用串口(包括RS232和RS485 ),也可以选择以太网口。
其通信遵循以下的过程:
主设备向从设备发送请求;
从设备分析并处理主设备的请求,然后向主设备发送结果;
如果岀现任何差错,从设备将返回一个异常功能码。
英创ModBus 通讯协议软件产品简介
英创公司推出的ModBus通讯协议软件产品主要应用于英创ARM9嵌入式主板环境,英创工控
主板均带有丰富的串口、网络资源、通用GPIO接口等,同时具有强大的处理能力。
结合ModBus通
讯协议软件,就可非常方便地构成符合ModBus通讯规范的主控(Master )及设备(Slave )的应用
平台。
针对ModBus通讯的主从方式这一特点,英创公司的ModBus通讯协议软件包分为两个可独
立使用的部分,即“ModBus主控协议软件”(简称modbus_Master )以及“ModBus设备方协议软件”(简称modbus_Slave )。
目前英创ModBus通讯协议软件运行于WinCE环境下,均以C函数加静态LIB库的形式提供给客户。
其主要特征如下:
非常适用于实时的工业应用
可以支持基于串口的ModBus通讯协议应用或TCP的ModBus通讯协议应用
RTU传输模式。
支持大多数的Modbus功能码操作,包括对线圈、离散开关输入的位操作,以及对寄存器的字节操作。
支持广播地址。
可以灵活设置ModBus通讯的超时时间。
可以获取通讯中传输协议的错误代码的详细信息。
英创ModBus 协议软件通讯关系图
ModBus 应闻 &
英创ModBus 协议软件支持的功能码
软件基本使用方法
为了方便应用程序的使用,对不同的通讯介质保持一致的代码形式,英创所提供的ModBus协议
软件(包括modbus_Master 和modbus_Slave )中的API函数可以同时支持基于串口和TCP的M odbus协议,应用程序只需要在调用初始化函数时,用不同参数区分即可,有关参数的说明请参见相应的头文件:modbus_Master.h 和modbus_Slave.h
1、modbus_Master 的应用
作为Modbus客户端模式的应用,主要是准备请求并向服务器设备发送请求,并等待服务器的响应。
在做此类应用开发时,用户可参考Modbus标准文献以及被控设备的通讯接口数据手册,直接调
用英创提供的modbus_Master 软件包提供了相应的操作API函数,来完成对服务器设备的访问和控制。
在进行此类应用开发时,用户只需要包含modbus_master.h/ modbus_master.lib 即可。
2、modbus_Slave 的应用
作为ModBus服务器模式的应用,主要需要实现了对于ModBus应用报文的分析与响应,但这
还只是ModBus整个通讯的一部分,另一部分是还需要有对应用数据的访问,这部分的内容则需要用户自己来进行定义。
为了方便客户的使用,在modbus_Slave 软件包中通过函数指针的形式,实现
了这些用户接口函数的自动加载,将用户应用数据处理和ModBus应用报文响应关联起来。
用户只需
根据需求定义这些接口函数来实现相应的功能,各个函数具体的定义是通过专门的一个CPP文件:D ataProvider.cpp 来实现。
由此可见在这类的开发应用时,需包含两个部分的内容,一部分是modbus_slave.h/ modbu
s_slave.lib 定义的API 函数;另一部分是DataProvider.h /DataProvider.cpp 定义的用户数据接口函数,其中接口函数需要用户在DataProvider.cpp 中具体实现。
为了及时地响应ModBus 应用报文,需要注意的是在程序设计时应设计一个线程反复调用bus_Slave 执行函数,该函数为阻塞模式。
举例如下:
(2)线程中调用执行函数Serverloop 响应请求
while ( 1 )
{
// 调用执行函数,用于对ModBus 报文的分析和响应。
result = mbusSlave_ServerLoop( hPort );
if( result!=0 ) // 检查是否返回错误
{
// 出错处理:本例为获取并打印错误代码的文本信息
wcscpy( szText, mbusSlave_GetErrorText( result ) );
i1 = wcslen( szText ); mod
(1)启动modbus 设备方协议hPort =
mbusSlave_StartupServer( 或者
hPort=mbusSlave_StartupServer(
_T('*'), 1, 10000, mbusSlave_Interface );
_T('COM3:9600-8-1-0'),1,10000,
mbusSlave_Interface );
if( i1>0 ) {
wcstombs( strText, szText, printf( ' error code: %s!\n', }i1 ); strText );。