modbus与plc通讯 vb程序caoxi

该程序可以实现实时数据采集显示,以及能对寄存器进行设置。

程序很简单,想用的可以完善,现在只能实时采集显示一个地址的数据,只要修改一下,就可以实时采集多个地址的数据。

现在也只能一次对一个寄存器进行设置,也可以更加完善。

下面是运行界面,采集的模块的地址为75,是一个温湿度采集模块。

有3个寄存器,显示的数据上是温度,湿度,露点温度。

modbusPrivate Sub Command1_Click() '设置按钮Dim bisend() As ByteDim crcDim btLoCRC As Byte, btHiCRC As ByteDim Data As IntegerIf MSComm1.PortOpen = True ThenIf Combo5.ListIndex = 0 ThenReDim bisend(7) '重新定义数组长度bisend(0) = "&h" + Hex(V al(Text1.Text)) '地址码bisend(1) = "&h" + Hex(3) '功能码读寄存器bisend(2) = "&h" + Hex(0) '起始地址高位bisend(3) = "&h" + Hex(0) '起始地址低位bisend(4) = "&h" + Hex(0) '寄存器个数高位bisend(5) = "&h" + Hex(Combo6.ListIndex + 1) '寄存器个数低位crc = CRC16(bisend, 6, btLoCRC, btHiCRC)bisend(6) = "&h" + Hex(btLoCRC) 'CRC高位bisend(7) = "&h" + Hex(btHiCRC) 'CRC低位'发送数据MSComm1.Output = bisendElseReDim bisend(10) '一次只能写一个寄存器bisend(0) = "&h" + Hex(V al(Text1.Text)) '地址码bisend(1) = "&h" + Hex(16) '功能码写寄存器bisend(2) = "&h" + Hex(0) '起始地址高位bisend(3) = "&h" + Hex(0) '起始地址低位bisend(4) = "&h" + Hex(0) '寄存器个数高位bisend(5) = "&h" + Hex(1) '寄存器个数低位bisend(6) = "&h" + Hex(2) '字节数Data = Val(Trim(Text3.Text))bisend(7) = "&h" + Hex(Data \ 256) '要写入寄存器的值的高字节bisend(8) = "&h" + Hex(Data Mod 256) '要写入寄存器的值的低字节crc = CRC16(bisend, 9, btLoCRC, btHiCRC)bisend(9) = "&h" + Hex(btLoCRC) 'CRC高位bisend(10) = "&h" + Hex(btHiCRC) 'CRC低位MSComm1.Output = bisendEnd IfElseMsgBox "串口没有打开"End IfEnd SubPrivate Sub Command2_Click() '实时采集按钮Timer1.Enabled = Not Timer1.Enabled '进行状态切换End SubPrivate Sub Command3_Click()'初始化,并打开串口With MSComm1If .PortOpen = False Then.CommPort = Combo7.ListIndex + 1 '打开串口1.Settings = Combo1.Text + "," + Combo2.Text + "," + Combo3.Text + Combo4.Text.InputMode = 1.InputLen = 50 '一次性从接收缓冲区中读取所有数据(8个字节为一组!!).InBufferCount = 0 '清空接收缓冲区.OutBufferCount = 0 '清空发送缓冲区.RThreshold = 5 + (Combo6.ListIndex + 1) * 2.InBufferSize = 1024.OutBufferSize = 1024.PortOpen = TrueElseMsgBox "串口已经打开"End IfEnd WithEnd SubPrivate Sub Command4_Click() '关闭串口按钮If MSComm1.PortOpen = True ThenMSComm1.PortOpen = FalseEnd IfEnd SubPrivate Sub Form_Load()Dim i As Integer'波特率设置Combo1.AddItem "4800", 0 Combo1.AddItem "9600", 1 Combo1.AddItem "115200", 2'校验位设置Combo2.AddItem "N", 0Combo2.AddItem "E", 1Combo2.AddItem "O", 2'数据位设置Combo3.AddItem "7", 0Combo3.AddItem "8", 1'停止位设置Combo4.AddItem "1", 0Combo4.AddItem "2", 1'功能码选择Combo5.AddItem "读寄存器03", 0 Combo5.AddItem "写寄存器16", 1'寄存器个数设置Combo6.AddItem "1", 0Combo6.AddItem "2", 1Combo6.AddItem "3", 2Combo6.AddItem "4", 3Combo6.AddItem "5", 4 Combo6.AddItem "6", 5Combo6.AddItem "7", 6Combo6.AddItem "8", 7Combo6.AddItem "9", 8Combo6.AddItem "10", 9 Combo6.AddItem "11", 10 Combo6.AddItem "12", 11 Combo6.AddItem "13", 12 Combo6.AddItem "14", 13Combo6.AddItem "15", 14Combo6.AddItem "16", 15Combo6.AddItem "17", 16Combo6.AddItem "18", 17Combo6.AddItem "19", 18Combo6.AddItem "20", 19Combo6.AddItem "21", 20Combo6.AddItem "22", 21'串口选择Combo7.AddItem "串口1", 0Combo7.AddItem "串口2", 1Combo7.AddItem "串口3", 2Combo7.AddItem "串口4", 3'初始赋值Combo1.ListIndex = 1Combo2.ListIndex = 1Combo3.ListIndex = 1Combo4.ListIndex = 0Combo5.ListIndex = 0Combo6.ListIndex = 2Combo7.ListIndex = 0'初始化串口End SubPrivate Sub Form_Unload(Cancel As Integer)If MSComm1.PortOpen = True ThenMSComm1.PortOpen = FalseEnd IfEnd SubPrivate Sub MSComm1_OnComm()Dim INByte() As ByteDim Buf As StringDim btLoCRC As Byte, btHiCRC As ByteDim Data As IntegerIf mEvent = comEvReceive Then '接收到数据以后INByte = MSComm1.InputIf INByte(1) = 3 Then '读寄存器'CRC校验crc = CRC16(INByte, UBound(INByte) - LBound(INByte) - 1, btLoCRC, btHiCRC)If INByte(UBound(INByte) - 1) = btLoCRC And INByte(UBound(INByte)) = btHiCRC Then'校验正确'////////////////////////////////////For i = 3 To UBound(INByte) - 2 Step 2Data = "&h" + Hex(INByte(i)) + Hex(INByte(i + 1))' Buf = Buf + Hex(INByte(i)) + Chr(32)Buf = Buf + Str(Data) '转换为十进制显示Next iList1.AddItem BufEnd IfEnd IfMSComm1.InBufferCount = 0 '请缓存End IfEnd SubPrivate Sub Timer1_Timer()'定时发送命令Dim tbisend(7) As ByteDim crc '定时1sDim btLoCRC As Byte, btHiCRC As ByteDim Buf As StringIf MSComm1.PortOpen = True Thentbisend(0) = "&h" + Hex(Val(Text1.Text)) '地址码tbisend(1) = "&h" + Hex(3) '功能码读寄存器tbisend(2) = "&h" + Hex(0) '起始地址高位tbisend(3) = "&h" + Hex(0) '起始地址低位tbisend(4) = "&h" + Hex(0) '寄存器个数高位tbisend(5) = "&h" + Hex(Combo6.ListIndex + 1) '寄存器个数低位crc = CRC16(tbisend, 6, btLoCRC, btHiCRC)tbisend(6) = "&h" + Hex(btLoCRC) 'CRC高位tbisend(7) = "&h" + Hex(btHiCRC) 'CRC低位'发送数据MSComm1.Output = tbisendEnd IfEnd Sub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////Function CRC16(Data() As Byte, no As Integer, CRC16Lo As Byte, CRC16Hi As Byte) As String Dim CL As Byte, CH As Byte '多项式码&HA001Dim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For i = 0 To no - 1CRC16Lo = CRC16Lo Xor Data(i) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2 '高位右移一位CRC16Lo = CRC16Lo \ 2 '低位右移一位If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1End If '否则自动补0If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iDim ReturnData(1) As ByteReturnData(0) = CRC16Hi 'CRC高位ReturnData(1) = CRC16Lo 'CRC低位CRC16 = ReturnDataEnd Function'CRC低位字节值表Function GetCRCLo(ind As Long) As ByteGetCRCLo = Choose(ind + 1, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC1, &H80, &H41, &H0, &HC1, _&H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H81, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81,&H40, _&H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40)End Function'CRC高位字节值表Function GetCRCHi(ind As Long) As ByteGetCRCHi = Choose(ind + 1, &H0, &HC0, &HC1, &H1, &HC3, &H3, &H2, &HC2, &HC6, &H6, &H7, &HC7, &H5, &HC5, &HC4, &H4, &HCC, &HC, &HD, &HCD, _&HF, &HCF, &HCE, &HE, &HA, &HCA, &HCB, &HB, &HC9, &H9, _&H8, &HC8, &HD8, &H18, &H19, &HD9, &H1B, &HDB, &HDA, &H1A, _&H1E, &HDE, &HDF, &H1F, &HDD, &H1D, &H1C, &HDC, &H14, &HD4, _&HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2, &H12, &H13, &HD3, _&H11, &HD1, &HD0, &H10, &HF0, &H30, &H31, &HF1, &O33, &;HF3, _&HF2, &H32, &H36, &HF6, &HF7, &H37, &HF5, &H35, &H34, &HF4, _&H3C, &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A, _&H3B, &HFB, &H39, &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29, _&HEB, &H2B, &H2A, &HEA, &HEE, &H2E, &H2F, &HEF, &H2D, &HED, _&HEC, &H2C, &HE4, &H24, &H25, &HE5, &H27, &HE7, &HE6, &H26, _&H22, &HE2, &HE3, &H23, &HE1, &H21, &H20, &HE0, &HA0, &H60, _&H61, &HA1, &H63, &HA3, &HA2, &H62, &H66, &HA6, &HA7, &H67, _&HA5, &H65, &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F, _&H6E, &HAE, &HAA, &H6A, &H6B, &HAB, &H69, &HA9, &HA8, &H68, _&H78, &HB8, &HB9, &H79, &HBB, &H7B, &H7A, &HBA, &HBE, &H7E, _&H7F, &HBF, &H7D, &HBD, &HBC, &H7C, &HB4, &H74, &H75, &HB5, _&H77, &HB7, &HB6, &H76, &H72, &HB2, &HB3, &H73, &HB1, &H71, _&H70, &HB0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92, _&H96, &H56, &H57, &H97, &H55, &H95, &H94, &H54, &H9C, &H5C, _&H5D, &H9D, &H5F, &H9F, &H9E, &H5E, &H5A, &H9A, &H9B, &H5B, _&H99, &H59, &H58, &H98, &H88, &H48, &H49, &H89, &H4B, &H8B, _&H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D, &H4C, &H8C, _&H44, &H84, &H85, &H45, &H87, &H47, &H46, &H86, &H82, &H42, _&H43, &H83, &H41, &H81, &H80, &H40)End Function。

合集下载

PLC的Modbus通信

PLC的Modbus通信
写命令同样存在地址不同的情况。
第二,就是要读取的数据量是以字为单位而不是以字节为单位。
3.3 I/O
在这次设计中一共用到了5个输入,3个输出,具体分配如表7
表7 I/O分配表
I/O名称
作用
I/O类型
I0.0
复位按钮
输入
I0.1
发送步进电机阶段1控制命令
输入
I0.2
发送步进电机阶段2控制命令
输入
I0.3
数据量H
所读取数据的个数以两个字节表示(注:此处说的数据量以字为单位)
数据量L
CRC H
CRC校验码在数据帧中以两个字节表示,主要用于检验数据传输过程中是否出错
CRC L
例:
需要读取2号站从第4个寄存器开始的3个寄存器,MODBUS主站发送的数据帧为:
02 03 00 04 00 03 44 39
从站在接收到主站的读命令以后,会发送一个返回命令帧,返回的命令帧格式如表3。
Done:指令完成时该位置1。
Error:当指令执行出现错误时,在该寄存器处显示出错误号。
例:
1、需要读取2号站地址为0004开始的3个寄存器里面的值到VB200地址开始的寄存器里,设置如图4。
2、需要将VB100地址开始的4个寄存器里面的值写到地址为004F开始的寄存器里面,设置如图5。
图4读数据设置图6写数据设置
2:功能码相同
3:两个数据帧的地址HoldStart相同
4:两个数据帧的数据量DataNum相同
如果从站在接收到数据以后,认为接收到的主站发送过来的数据是错误的,会返回一个异常帧给主站,告诉主站,从站接收到的数据是错误的。异常帧的数据格式如表10,命令帧不再具体说明。
表10异常帧格式

VB 与 PLC 通讯

VB 与 PLC  通讯

Private Sub MSComm1_OnComm()Select Case mEventCase comEvReceive'此处添加处理接收的代码End SelectEnd Sub'发送主代码frmMain.MSComm1.Output = bytSendByte在使用MSComm控件时需注意接收是以ASCII码或二进制码详细可参阅“人名邮电出版社”的“VISUAL BASIC 串口通讯实例导航”一书。

按你提供的C2C7FAE1看为16进制数,其10进制值为-1027081503,如何处理成-99.99要看下位机是如何约定数据的来定.Text1 = &HC2C7FAE1 或Text1 = VAL(&HC2C7FAE1)一般上下位机对数字值传递通常以16位二进制数字传递,而小数点不传递,仅乘一定倍率来实现.同时16位二进制数字按两个8位(ASCII码值)输送,上位机通过程序代码处理成10进制数.串口传送数据实质是传送ASCII码,如是8位二进制数据,其ASCII码值(10进制)为0-255。

用二进制表示为00000000 - 1111111116进制表示为00 - FF传送数据大于255,则用16位二进制(即2字节ASCII码组成)。

10进制范围-32768到+32767。

如有小数,则应由上下位机约定,不进行发送。

串口通信中数制转换必须相当重视。

以上是以二进制方式收发数据。

也可直接以ASCII码的文本方式发送数据,而字节量大。

如何实现串口数据采集,如何分析这些数据?MSCOMM控件在VB6的企业版中有,需通过部件添加方式加载。

Private Sub MSComm_OnComm()Dim bytInput() As ByteDim intInputLen As IntegerSelect Case mEventCase comEvReceiveIf blnReceiveFlag ThenIf Not frmMain.ctrMSComm.PortOpen ThenmPort = intPortfrmMain.ctrMSComm.Settings = strSetfrmMain.ctrMSComm.PortOpen = TrueEnd If'此处添加处理接收的代码frmMain.ctrMSComm.InputMode = comInputModeText '按ASCII 接收intInputLen = frmMain.ctrMSComm.InBufferCountReDim bytInput(intInputLen)bytInput = frmMain.ctrMSComm.InputText1 = bytInputText2 = Text1jscd = Len(Text1)If Left(Text1, 1) <> Chr(27) Or jscd > 25 Then 'bel3.BackColor = vbRedbel3.ForeColor = vbWhitebel3.Caption = "接收信号出错!"ElseIf Left(Text2, 1) = Chr(27) And Mid(Text2, 25, 1) = Chr(13) Thenbel3.BackColor = vbGreenbel3.ForeColor = vbBlackbel3.Caption = "接收信号正常!"If Left(Text2, 6) = Chr(27) & "R0032" And jscd = 25 ThenIf Val(fa2) >= 0 And Len(fa2) = 4 Thenfa2 = "0" & Mid(fa2, 2, 3)End IffrmMain.txtSend = Chr(27) & fa0 & fa1 & "9999" & zhenkong & fa2 & fa3 & fa4 & Chr(13)lenTxtSend = Len(txtSend)bel8.Caption = txtSendbel11.Caption = lenTxtSendIf lenTxtSend = 24 ThenCall commFasongElsebel3.BackColor = vbRedbel3.ForeColor = vbWhitebel3.Caption = "发送信号出错!"End IfblL1 = Mid$(Text2, 19, 2)If blL1 = "01" Thenrecord_jmm(0) = Val(Mid$(Text2, 21, 4)) / 10 '制品1温度ElseIf blL1 = "02" Thenrecord_jmm(1) = Val(Mid$(Text2, 21, 4)) / 10 '制品2温度ElseIf blL1 = "03" Thenrecord_jmm(2) = Val(Mid$(Text2, 21, 4)) / 10 '制品3温度ElseIf blL1 = "04" Thenrecord_jmm(3) = Val(Mid$(Text2, 21, 4)) / 10 '制品4温度ElseIf blL1 = "05" Thenrecord_jmm(4) = Val(Mid$(Text2, 21, 4)) / 10 '制品5温度ElseIf blL1 = "06" Thenrecord_jmm(5) = Val(Mid$(Text2, 21, 4)) / 10 '制品6温度End Ifrecord_jm(0) = Val(record_jmm(0))record_jm(1) = Val(record_jmm(1))record_jm(2) = Val(record_jmm(2))record_jm(3) = Val(record_jmm(3))record_jm(4) = Val(record_jmm(4))record_jm(5) = Val(record_jmm(5))blL = Mid$(Text2, 7, 6)Call Hex_bin '输出口状态鉴别blLg = Mid$(Text2, 13, 6)Call hex_bin1 '输出口故障状态鉴别txtSend = ""ElsetxtSend = ""End IfEnd IfIf Not blnAutoSendFlag And Not blnReceiveFlag ThenfrmMain.ctrMSComm.PortOpen = FalseEnd IfEnd IfEnd SelectEnd Sub以上是一段MSCOMM的ONCOMM事件代码,接收的数据按上下位机约定取出赋值于全局变量,在其它窗体进行数据记录(写入数据库).至于数据分析确如一楼说的可以海阔天空,通过数据控件及SQL语句来完成任务.以下提供MSDN参考:OnComm 常数常数值描述comEvSend 1 发送事件。

VB和台达PLC上位机通讯软件

VB和台达PLC上位机通讯软件

为答谢各位网友的支持,也算是一个小小的礼物吧,特将我以VB写的一个工控通讯程序源码奉上,以资感谢.这个程序是VB同台达PLC的通讯调试程序,其于台达系列PLC的MODBUS ASCII协议,涉及IO及寄存器的读写,稍加改动即可用于工控项目中.我在写这个程序时,也参考了<<基于VB 的台达PLC和监控计算机的串口通讯>>一文,在此也向作者表示感谢.Dim plc As ByteDim y0flag As ByteDim y1flag As ByteDim str As StringDim n, SPrivate Sub Command1_Click()Dim strout As StringDim QQ As String= FalseQQ =If Len(QQ) = 3 ThenQQ = "0" & QQElseIf Len(QQ) = 2 ThenQQ = "00" & QQElseIf Len(QQ) = 1 ThenQQ = "000" & QQEnd Ifstr = "01061000" + QQLRCC = LRC(str) '计算str的lrc校验码。

strout = ":" + str + LRCC + Chr$(13) + Chr$(10) '欲传送之数据。

13为D,1 0为A= 0= strout= TrueEnd SubPrivate Sub Command2_Click()End SubPrivate Sub Form_Load()Dim s1 As StringDim s2 As StringDim s22 As StringDim s3 As StringDim s4 As String0, 0, 5600, 280 '长度可随意改= Truen = -(Now)) - 10= True= Trues2 = "01010C300001"s22 = LRC(s2)s1 = ":" + s2 + s22 + Chr$(13) + Chr$(10)= 0= s1TimeDelay (500)s3 =s4 = Mid$(s3, 8, 2)If s4 = "31" Thenplc = 1Else: If s4 = "30" Then plc = 0End IfIf plc = 1 Then= "PLC Running"= RGB(0, 255, 0) 'greenElse= "PLC Stopped!"= RGB(255, 0, 0) 'redEnd IfEnd SubPublic Function LRC(str As String) As Stringc = 0l = Len(str)For c = c + 1 To lc_data = Mid$(str, c, 2)d_lrc = d_lrc + Val("&H" + c_data)c = c + 1Next cIf d_lrc > &HFF Thend_lrc = d_lrc Mod &H100End Ifh_lrc = Hex(&HFF - d_lrc + 1)If Len(h_lrc) > 2 Thenh_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)End IfLRC = h_lrcEnd FunctionPrivate Sub start_Click()Dim strout As String= Falsestr = "01050C30FF00" 'M1072 为PLC起动停止标志位。

VB实现PC与欧姆龙PLC通讯的串口编程

VB实现PC与欧姆龙PLC通讯的串口编程

VB实现PC与欧姆龙PLC通讯的串口编程第一篇:VB实现PC与欧姆龙PLC通讯的串口编程Private Sub Form_Load()Dim i As Integer'OPEN COM1If ComTrue(1)= 0 ThenIf ComOpen(1, 38400, 7, 1, 1, “sjh”)= 1 Then 'MsgBox(“已注册”)'sjh为你的注册账号Call SetDelayNum(64)End IfEnd Ifjisujisu1jisu2End Sub第二篇:VB中串口通讯的实现VB中串口通讯的实现.txt VB中串口通讯的实现------------------一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC 间的通讯以及PC和单片机之间的通讯之中。

提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。

实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。

下面,笔者就介绍一下在VB 中实现串口通讯的方法。

在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。

我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。

下面,笔者就简要地介绍一下MSComm控件的使用方法。

二、MSComm控件的主要属性、事件1、MSComm的属性由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。

Commport:设置通讯所占用的串口号。

如设成1(默认值),表示对Com1进行操作。

Setting:对串口通讯的相关参数。

包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。

其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。

VB编写的Modbus RTU协议通讯源程序-推荐下载

VB编写的Modbus RTU协议通讯源程序-推荐下载

modbus rtu协议可以算是一种事实上的工业标准协议,为许多仪表、PLC等所支持。

以前有几个用户问如何使用VB编程来与我们的KND-K3系列PLC通讯,于是整了一个demo 程序。

这次把这个demo共享,希望能给大家一点帮助。

1)模块文件:modCRC,其中包含了CRC校验的函数。

'data 待校验的数组名称'no 数组中元素个数'btLoCRC 算出的CRC高字节'btHiCRC 算出的CRC低字节Public Function CalCRC16Fast(data() As Byte, no As Integer, btLoCRC As Byte, btHiCR C As Byte) As StringDim CL As Byte, CH As Byte '多项式码&HA001Dim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerbtHiCRC = &HFFbtLoCRC = &HFFCL = &H1CH = &HA0For i = 0 To (no - 1)btHiCRC = btHiCRC Xor data(i) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = btLoCRCSaveLo = btHiCRCbtLoCRC = btLoCRC \ 2 '高位右移一位btHiCRC = btHiCRC \ 2 '低位右移一位If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1btHiCRC = btHiCRC Or &H80 '则低位字节右移后前面补1End If '否则自动补0If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或btLoCRC = btLoCRC Xor CHbtHiCRC = btHiCRC Xor CLEnd IfNext FlagNext iDim ReturnData(1) As ByteReturnData(0) = btHiCRC 'CRC高位ReturnData(1) = btLoCRC 'CRC低位CalCRC16Fast = ReturnDataEnd FunctionPublic Function CalCRC16Tbl(data() As Byte, no As Integer, btLoCRC As Byte, btHiCRC As Byte) As StringDim btLoCRC As ByteDim btHiCRC As BytebtLoCRC = &HFFbtHiCRC = &HFFDim i As IntegerDim iIndex As LongFor i = 0 To (no - 1)iIndex = btHiCRC Xor data(i)btHiCRC = btLoCRC Xor GetCRCLo(iIndex) '低位处理btLoCRC = GetCRCHi(iIndex) '高位处理Next iDim ReturnData(1) As ByteReturnData(0) = btHiCRC 'CRC高位ReturnData(1) = btLoCRC 'CRC低位CalCRC16Tbl = ReturnDataEnd Function'CRC低位字节值表Function GetCRCLo(Ind As Long) As ByteGetCRCLo = Choose(Ind + 1, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, _&H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, _&H1, &HC0, &H80, &H41, &H0, &HC1, &H81, &H40, &H1, &HC0, _&H80, &H41, &H0, &HC1, &H81, &H40, &H0, &HC1, &H81, &H40, _&H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, _&H81, &H40, &H0, &HC1, &H81, &H40, &H1, &HC0, &H80, &H41, &H0, &H C1, &H81, &H40, &H1, &HC0, &H80, &H41, &H1, &HC0, &H80, &H41, &H0, &HC1, &H8 1, &H40)End Function'CRC高位字节值表Function GetCRCHi(Ind As Long) As ByteGetCRCHi = Choose(Ind + 1, _&H0, &HC0, &HC1, &H1, &HC3, &H3, &H2, &HC2, &HC6, &H6, &H7, &HC7, &H5, &HC5, &HC4, &H4, &HCC, &HC, &HD, &HCD, &HF, &HCF, &HCE, &HE, &HA, &H CA, &HCB, &HB, &HC9, &H9, &H8, &HC8, &HD8, &H18, &H19, &HD9, &H1B, &HDB, & HDA, &H1A, &H1E, &HDE, &HDF, &H1F, &HDD, &H1D, &H1C, &HDC, &H14, &HD4, & HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2, &H12, &H13, &HD3, &H11, &HD1, &HD 0, &H10, &HF0, &H30, &H31, &HF1, &H33, &HF3, &HF2, &H32, &H36, &HF6, &HF7, &H 37, &HF5, &H35, &H34, &HF4, &H3C, &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A, &H3B, &HFB, &H39, &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29, &HEB, &H2B, &H2A, &HEA, &HEE, &H2E, &H2F, &HEF, &H2D, &HED, &HEC, &H2C, &HE 4, &H24, &H25, &HE5, &H27, &HE7, &HE6, &H26, &H22, &HE2, &HE3, &H23, &HE1, & H21, &H20, &HE0, &HA0, &H60, _&H61, &HA1, &H63, &HA3, &HA2, &H62, &H66, &HA6, &HA7, &H67, &HA5, &H65, &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F, &H6E, &HAE, &HAA, &H6A, & H6B, &HAB, &H69, &HA9, &HA8, &H68, &H78, &HB8, &HB9, &H79, &HBB, &H7B, &H7 A, &HBA, &HBE, &H7E, &H7F, &HBF, &H7D, &HBD, &HBC, &H7C, &HB4, &H74, &H75, &HB5, &H77, &HB7, &HB6, &H76, &H72, &HB2, &HB3, &H73, &HB1, &H71, &H70, &H B0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92, &H96, &H56, &H57, &H97, & H55, &H95, &H94, &H54, &H9C, &H5C, &H5D, &H9D, &H5F, &H9F, &H9E, &H5E, &H5 A, &H9A, &H9B, &H5B, &H99, &H59, &H58, &H98, &H88, &H48, &H49, &H89, &H4B, & H8B, &H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D, &H4C, &H8C, &H44, &H8 4, &H85, &H45, &H87, &H47, &H46, &H86, &H82, &H42, &H43, &H83, &H41, &H81, &H 80, &H40)End Function2)窗体:FORM1,上面放置的控件如下:Begin VB.Form frmComCaption = "Form1"ClientHeight = 8235ClientLeft = 3885ClientTop = 2250ClientWidth = 6810LinkTopic = "Form1"ScaleHeight = 8235ScaleWidth = 6810Begin VB.TextBox txtReceive ‘注:放置接收上来的IB0数据Height = 495Left = 1200TabIndex = 2Top = 2280Width = 1335EndBegin mandButton Command1Caption = "读取IB0"Height = 495Left = 2760TabIndex = 1Top = 2280Width = 1695EndBegin mandButton cmdSDOCaption = "置位Q1.1"Height = 495Left = 2160TabIndex = 0Top = 3720Width = 1575EndBegin MSCommLib.MSComm ComK3Left = 480Top = 1080_ExtentX = 1005_ExtentY = 1005_Version = 393216DTREnable = -1 'TrueEndEnd① Form_Load事件,在此主要是实现了打开并初始化串口Private Sub Form_Load()With ComK3.CommPort = 1.Settings = "19200,N,8,1".InputMode = comInputModeBinary '二进制收发.InBufferSize = 512.OutBufferSize = 512If (Not .PortOpen) Then .PortOpen = TrueEnd WithEnd Sub② Form_UnLoad事件,在此主要是关闭串口Private Sub Form_Unload(Cancel As Integer)If (ComK3.PortOpen) ThenComK3.PortOpen = FalseEnd IfEnd Sub③ “置位Q1.1”按钮单击事件'设置Q1.1为1Private Sub cmdSDO_Click()Dim btSend(8) As BytebtSend(0) = &H1 '目标站号btSend(1) = &H5 '功能码btSend(2) = &H0 'Q1.1地址(0009)高字节btSend(3) = &H9 'Q1.1地址(0009)低字节btSend(4) = &HFF '强制值高字节btSend(5) = &H0 '强制值低字节Dim crcDim btCRCHi As Byte, btCRCLo As Bytecrc = CalCRC16Fast(btSend, 6, btCRCLo, btCRCHi)btSend(6) = btCRCHibtSend(7) = btCRCLoComK3.Output = CVar(btSend)End Sub④ “读取IB0”按钮单击事件'查表知I0.0的modbus地址为0000,从I0.0开始读取连续8位Private Sub Command1_Click()'发请求Dim btSend(8) As BytebtSend(0) = &H1 '目标站号btSend(1) = &H2 '功能码btSend(2) = &H0 'I0.0地址(0000)高字节btSend(3) = &H0 'i0.0地址(0000)低字节btSend(4) = &H0 '读取个数高字节btSend(5) = &H8 '读取个数低字节Dim crcDim btCRCHi As Byte, btCRCLo As Bytecrc = CalCRC16Fast(btSend, 6, btCRCLo, btCRCHi)btSend(6) = btCRCHibtSend(7) = btCRCLoComK3.Output = CVar(btSend)'注意下面编写的接收过程很简单,要编写实际应用的监控程序来说需要更完善 Dim btReceive As VariantWith ComK3DoDoEventsLoop Until .InBufferCount = 6.InputLen = 6btReceive = .InputIf btReceive(1) = &H2 Then '若正确,返回帧的第2个字节为功能码.实际上,此处应首先进行CRC校验txtReceive.Text = Hex$(btReceive(3))End IfEnd WithEnd Sub。

用VB写的modbusrtu模式通讯源码

用VB写的modbusrtu模式通讯源码

用VB写的modbusrtu模式通讯源码‘用VB 写的modbus rtu模式通讯源码,已在台达PLC上调试通过Private Sub CmdOpen_Click()On Error Resume NextIf (MSComm1.PortOpen) Then ‘打开/关闭串口MSComm1.PortOpen = FalseElseMSComm1.PortOpen = TrueEnd IfIf (MSComm1.PortOpen) ThenCmdOpen.Caption = "关闭串口"Shape5.FillStyle = vbFSSolidElseCmdOpen.Caption = "打开串口"Shape5.FillStyle = vbFSTransparentEnd IfIf Err ThenMsgBox Error$, 48, "错误码信息"Exit SubEnd IfEnd SubPrivate Sub Combo1_Click()/doc/df18763589.html,mPort = Combo1.ListIndex + 1End SubPrivate Sub Combo2_Click()Call SettingEnd SubPrivate Sub Combo3_Click()Call SettingEnd SubPrivate Sub Combo4_Click()Call SettingEnd SubPrivate Sub Combo5_Click()Call SettingEnd SubPrivate Sub Command1_Click()‘S hape1.FillStyle = vbFSSolidDim Y0_status As ByteDim Sendstr As StringDim i As Integer, j As IntegerSendstr = "01 01 05 00 00 10 "HexSend (Sendstr)Sleep (30)HexSend (Sendstr)End SubPrivate Function HexSend(Sendstr As String) As Integer Dim outbuf() As ByteDim Temp(0) As ByteDim crc As String, Sendstrls As StringDim sendlen As IntegerDim i As Integer, j As IntegerIf Sendstr = "" ThenMsgBox "发送数据不能为空!"HexSend = 0Exit FunctionEnd IfS endstrls = Trim(Sendstr) ‘去掉空格sendlen = Len(Sendstrls) + 1 ‘取长度j = 0ReDim outbuf(1 To sendlen \ 3) As ByteFor i = 1 To sendlen Step 3j = j + 1outbuf(j) = Val("&H" & CStr(Mid(Sendstrls, i, 2)))Next icrc = Crc16(outbuf)ReDim Preserve outbuf(1 T o (sendlen \ 3 + 2)) As Byte ‘加上CRC校验码outbuf(sendlen \ 3 + 1) = Val("&H" & CStr(Mid(crc, 1, 2)))outbuf(sendlen \ 3 + 2) = Val("&H" & CStr(Mid(crc, 3, 2)))For i = 1 To (sendlen \ 3 + 2)Temp(0) = outbuf(i)MSComm1.Output = TempNext iFor i = 1 To 2000Next iHexSend = 1End FunctionPrivate Function Setting()MSComm1.Settings = CStr(Combo2.Text) & "," & CStr(Combo3.Text) & "," & CStr(Combo4.Text) & "," & CStr(Combo5.Text) End FunctionPrivate Sub Command2_Click()‘If (MSComm1.RThreshold = 0) Then‘MSComm1.RTh reshold = 1‘Else‘MSComm1.RThreshold = 0‘End IfLabel11.Caption = "接收个数:" & CStr(ReceCount) & " " & "接收帧数:" & CStr(Framecount) End SubPrivate Sub Form_Load()Combo1.AddItem ("COM1")Combo1.AddItem ("COM2")Combo1.AddItem ("COM3")Combo1.AddItem ("COM4")Combo1.AddItem ("COM5")Combo1.ListIndex = 0Combo2.AddItem ("2400")Combo2.AddItem ("4800")Combo2.AddItem ("9600")Combo2.AddItem ("11520")Combo2.ListIndex = 0Combo3.AddItem ("E")Combo3.AddItem ("O")Combo3.AddItem ("N")Combo3.ListIndex = 2Combo4.AddItem ("6")Combo4.AddItem ("7")Combo4.AddItem ("8")Combo4.ListIndex = 2Combo5.AddItem ("1")Combo5.AddItem ("2")Combo5.ListIndex = 0ReceCount = 0End SubPrivate Function Crc16(data() As Byte) As StringDim CRC16Lo As Byte, CRC16Hi As Byte ‘CRC寄存器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 = 1 To UBound(data)CRC16Lo = CRC16Lo Xor data(i) ‘每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2 ‘高位右移一位CRC16Lo = CRC16Lo \ 2 ‘低位右移一位If ((SaveHi And &H1) = &H1) Then ‘如果高位字节最后一位为1CRC16Lo = CRC16Lo Or &H80 ‘则低位字节右移后前面补1 End If ‘否则自动补0If ((SaveLo And &H1) = &H1) Then ‘如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iIf Len(Hex(CRC16Hi)) = 1 ThenCrcHi = "0" + Hex(CRC16Hi)ElseCrcHi = Hex(CRC16Hi)End IfIf Len(Hex(CRC16Lo)) = 1 ThenCrcLo = "0" + Hex(CRC16Lo)ElseCrcLo = Hex(CRC16Lo)End IfCrc16 = CrcLo & CrcHiEnd FunctionPrivate Sub MSComm1_OnComm()Dim inpu() As ByteDim i As IntegerDim tempstr As String, Strdata As StringSelect Case /doc/df18763589.html,mEvent Case comEvReceive ‘接收事件tempstr = MSComm1.Inputinpu() = tempstrFramecount = Framecount + 1 ‘帧个数加1If (Framecount = 1) Thenframepoint(Framecount) = UBound(inpu) + 1 ‘第一帧帧尾Elseframepoint(Framecount) = framepoint(Framecount - 1) + UBound(inpu) + 1 ‘第二帧开始指针End IfFor i = 0 To UB ound(inpu) ‘将字符转换为数组If (Len(Hex(inpu(i))) = 1) ThenStrdata = Strdata & "0" & Hex(inpu(i)) & " "ElseStrdata = Strdata & Hex(inpu(i)) & " "End IfNext iFor i = ReceCount + 1 To UBound(inpu) + 1 ‘数据进入缓冲区Recebuf(i) = inpu(i - 1)NextReceCount = ReceCount + UBound(inpu) + 1TextReceive.Text = TextReceive.Text & StrdataStrdata = ""Case comEvSendEnd SelectEnd SubPrivate Function RtuCheck(data() As Byte) As IntegerDim CrcHi As Byte, CrcLo As ByteDim Checkdata() As ByteDim i As IntegerDim crc As StringCrcHi = data(UBound(data))CrcLo = data(UBound(data) - 1)ReDim Checkdata(1 To (UBound(data) - 1)) As ByteFor i = 1 To (UBound(data) - 1) ‘附值Checkdata(i) = data(i - 1)Nextcrc = Crc16(Checkdata)If (CrcLo = Val("&H" & CStr(Mid(crc, 1, 2))) And CrcHi = Val("&H" & CStr(Mid(crc, 3, 2)))) Then RtuCheck = 1ElseRtuCheck = 0End IfEnd Function。

VB与PLC的通信

利用VB6.0 实现PC 与三菱PLC 的通信本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用编程电缆作为计算机与 PLC 通信的连线。

FX2系列PLC的编程接口采用RS-422标准,而计算机的串行口采用的是RS-232标准,因此作为实现PLC与计算机通信的接口模块FX-232AW,必须将RS-422标准转换成RS-232标准,同时在实现上述过程中采用光电隔离技术。

图1一、串口的相关知识1)串行通信的概念图2所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。

如图2所示。

这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢2)常见的串口通信规约:目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。

最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,且直接用RS232相连。

RS-232C: “1”=-3~-15;“0”=+3~+15速率:0~20000bps;一般传输距离:15m。

RS-422:采用平衡传输,平衡发送器、差动接收器,速率:10Mbps/15m;90Kbps/1200m抗干扰能力强。

DB9和DB25的常用信号脚说明由于FX 2-232AW 价格过贵所以我们选用选用MAXIM 公司的MAX202实现RS-232与TTL 之间的电平转换。

MAX202内部有电压倍增电路和转换电路,仅需+5V 电源就可工作,使用十分方便;选用MAX490实现RS-485与TTL 之间的转换。

每片MAX490有一对发送器/接收器,由于通信采用全双工方式,故需两片MAX490,另外只需外接4只电容即可。

Modbus 通讯协议VB编程

Label13.Enabled = True
Option6.Enabled = False
Option7.Enabled = False
Option11.value = True
Combo2.ListIndex = 1
Label13.Enabled = False
Option6.Enabled = True
Option7.Enabled = True
Combo2.ListIndex = 2
Combo5.ListIndex = 0
Option7.value = True
Option9.value = True
If MSComm1.PortOpen = False Then
Command1.Caption = "打开串口"
Text1.Enabled = True
Label14.Enabled = True
Frame7.Visible = False
End Sub
Private Sub Option4_Click() 'ASCII选项
Text7.Enabled = True
Text8.Enabled = True
Label10.Enabled = True
Label11.Enabled = True
Label12.Enabled = True
Combo3.AddItem "4800"
Combo3.AddItem "9600"
Combo3.AddItem "19200"
Combo3.AddItem "38400"

用VB写的程序与施耐德PLC(PLC型号BMX P34 2020)实现以太网通信.

用VB写的程序与施耐德PLC(PLC型号:BMX P34 2020)实现以太网通信。

调用winsock 控件,采用modbus协议。

已经顺利实现读线圈、写线圈、读寄存器整数、读寄存器浮点数。

(唯独没有写寄存器成功,原因在下)因为有个很奇怪的问题,在所有的读写过程中,不管是地址还是数据内容,每个字节都不可以超过&H80(十六进制数80)。

比如:向字寄存器%MW42 写数据,该寄存器存的是整数,数据长度为一个字(也就是16位二进制,4位16进制字符):运行结果如下:一、向寄存器%MW42(其地址为十六进制数002A)写入字符&H000F,运行结果如下:%MW42数据类型如下:整数1、VB里的发送数据程序:(1)Private Sub Command1_Click()(2)Dim str2(12) As Byte(3)str2(0) = &H0 '交换识别号高字节,通常为0(4)str2(1) = &H0 '交换识别号低字节,通常为0(5)str2(2) = &H0 '协议识别号高字节,为0(6)str2(3) = &H0 '协议识别号低字节,为0(7)str2(4) = &H0 '字节长度高字节(8)str2(5) = &H6 '字节长度低字节(9)str2(6) = &HFF '单元识别号,确省为255(10)str2(7) = &H6 'modbus功能码,06为预置单寄存器(11)str2(8) = &H0 '寄存器的起始地址高字节(12)str2(9) = &H2A '寄存器的起始地址低字节(13)str2(10) = &H0 '数据内容高字节(14)str2(11) = &HF '数据内容低字节(15)Dim bStrQ As String(16)Dim Q As Integer(17)For Q = 0 To 11(18)bStrQ = bStrQ & Chr(str2(Q))(19)Next(20)Winsock1.SendData bStrQ(21)Exit Sub(22)End Sub1、运行之前2、运行之后一切正常。

PLC与PLC通信篇(MODBUS)

14
2013-9-13
MODBUS指令实现的通讯 ——应用案例一 主站程序
从站程序
2013-9-13
15
2013-9-13
1
MODBUS协议说明

1、MODBUS通讯的底层为RS485信号, 采用双绞线进行联接就可以了,因此传输 距离较远,可达 1000米,抗干扰性能比较 好,且成本低,在工业控制设备的通讯中 被广泛使用,现在众多厂家的变频器、控 制器都采用了该协议。
2013-9-13
2
MODBUS协议说明


将D8126设定为H20,就将COM1口的 通讯协议配置为MODBUS-RTU主站协 议,在V24120版本以上的H2U系列 PLC中,还可直接使用“MODBUS”指 令进行通讯,“MODBUS”指令的4个 操作数支持的数据类型比较灵活,编程 更方便。 选择了MODBUS主站协议,才能进行 MODBUS通讯。
从机 地址
S 1
S 2
n
D
H
操作 命令
L
寄存器起始 地址
数据个 数
收/发数据 起始地址
1、从机地址:主站发送帧中,该地址表示目标接收从机的地址;从机应答帧中,表示本机地 址;从机地址的设定范围为1~247,0为广播通信地址。 2、操作命令:表示读或写操作;0x1=读线圈操作;0x03=读寄存器操作;0x05=改写线圈 操作;0x06=改写寄存器操作。对于变频器而言,只支持0x03读、0x06写的 操作。 3、寄存器起始地址:表示对从机中要访问的寄存器地址,对于MD280、MD320系列变频 器的访问时,对应的就是“功能码号”、“命令地址”、“运行参 数地 址”; 4、数据个数:即从“寄存器起始地址”开始要连续访问的数据个数,对于寄存器变量,以word 为
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档