VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码

VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码本人用的是Modbus RTU通讯模式,通过计算机串口转RS485与外围设备通行通讯,读写外围设备指定地址里的数据,从而达到自动化控制远端设备。

Dim HiByte As ByteDim LoByte As ByteDim CRC16Lo As ByteDim CRC16Hi As ByteDim ReturnData(1) As ByteDim K As IntegerDim CmdLenth As IntegerPrivate Sub Command1_Click()K = Text9.Text '写6 个字节Text13.Text = ""'=========== 数组赋值输入代码=============================================================================== ========'<< 算法一>>Dim WriteStr() As ByteDim u As IntegerReDim WriteStr(K + 2)For u = 0 To KWriteStr(u) = Val("&H" & Text1(u).Text)Next'<< 算法二>>Dim CRC_2() As ByteDim v As IntegerReDim CRC_2(K)For v = 0 To KCRC_2(v) = Val("&H" & Text1(v).Text)Next'============================================================================== ====================Call CRC161(CRC_2())Call CRC16(WriteStr(), K)MSComm1.InBufferCount = 0'========== 显示发送代码=============================================================================== =========Dim m As IntegerFor m = 0 To 23If m <= K ThenText8(m).Text = Hex(WriteStr(m))ElseText8(m).Text = ""End IfNext'============================================================================== ====================WriteStr(K + 1) = LoByteWriteStr(K + 2) = HiByte' 发送代码Text4.Text = ""Dim g As IntegerFor g = 0 To K + 2Text4.Text = Text4.Text + " " + Hex(WriteStr(g))Next'写命令发送后,当接收到8 个字节时中断CmdLenth = 8MSComm1.RThreshold = CmdLenthMSComm1.Output = WriteStrEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Command3_Click()Label34.Caption = "="Text13.Text = ""K = Text9.Text '写6 个字节'=========== 数组赋值输入代码=============================================================================== ========'<< 算法>>Dim CRC_2() As ByteDim v As IntegerReDim CRC_2(K)For v = 0 To KCRC_2(v) = Val("&H" & Text1(v).Text)Next'============================================================================== ====================Call CRC161(CRC_2())Call CRC16(WriteStr(), K)MSComm1.InBufferCount = 0'========== 显示发送代码=============================================================================== =========Dim m As IntegerFor m = 0 To 23If m <= K ThenText8(m).Text = Hex(WriteStr(m))ElseText8(m).Text = ""End IfNext'============================================================================== ====================WriteStr(K + 1) = LoByteWriteStr(K + 2) = HiByte' 发送代码Text4.Text = ""Dim g As IntegerFor g = 0 To K + 2Text4.Text = Text4.Text + " " + Hex(WriteStr(g))Next'读命令发送后,当接收5 + SendStr(5) * 2 个字节时产生中断CmdLenth = 5 + WriteStr(5) * 2MSComm1.RThreshold = CmdLenthMSComm1.Output = WriteStr '发送命令'****************************************************************************** **********************************************************'*******************************************************************************************************************'****************************************************************************** **********************************************************' Dim sAddr As String'' Dim CheckString As String' Dim CheckCode As String' Dim CmdCode As String' Dim Sum As Integer' Dim a As Integer' Dim tmp As String'a = 0'tmp = 0'''' Do While Len(tmp) < 8'' tmp = tmp + MSComm1.Input' testNO.Caption = testNO.Caption + " " + Str(Hex(Asc(tmp)))' a = a + 1' If a >= 3000 Then' MSComm1.PortOpen = False'Exit Function' Exit Do' End If' Loop'Label33.Caption = tmp'Text16.Text = Len(tmp)'Dim ns As Integer'For ns = 1 To Len(tmp)'Label34.Caption = Label34.Caption + "+" + Str(Asc(Mid(tmp, ns, 1))) ''Next'Label35.Caption = Str(Val(Asc(Mid(tmp, 6, 1))) / 10)''' tmp = Mid$(tmp, 6, 4)''' Dim strHex As String' Dim Hex2Dec As Long' Dim strTmp As String' Dim longTmp As Long' Dim longDec As Long' Dim intLen As Integer' Dim n1 As Integer'' strHex = Right$(tmp, 2) + Left$(tmp, 2)'' intLen = Len(strHex)' For n1 = 1 To intLen' strTmp = Mid(strHex, n1, 1)' Select Case Asc(strTmp)' Case 48 To 57' longTmp = Val(strTmp)' Case 65 To 70' longTmp = Asc(strTmp) - 55' Case Else' Hex2Dec = 0' ' Exit Function' End Select' Text13.Text = Text13.Text + "+" + Str(Asc(strTmp))' longDec = longDec + longTmp * 16 ^ (intLen - n1)' Next n1'' Hex2Dec = longDec' Text13.Text = Hex2Dec'****************************************************************************** **********************************************************'*******************************************************************************************************************'****************************************************************************** **********************************************************End SubPrivate Sub MSComm1_OnComm()Dim Ne As IntegerSelect Case mEventCase comEvReceiveDim Buffer As VariantMSComm1.InputMode = comInputModeBinaryMSComm1.InputLen = 0Buffer = MSComm1.InputFor Ne = LBound(Buffer) To UBound(Buffer)Text13.Text = Text13.Text & " + " & Buffer(Ne)Label34.Caption = Buffer(3) & " " & Buffer(4)Next NeCase ElseEnd SelectBeepEnd SubPrivate Sub Command4_Click()End SubPrivate Sub Command5_Click()Label34.Caption = "="Private Sub Form_Load()MSComm1.Settings = "9600,N,8,1"mPort = 1MSComm1.SThreshold = 0If Not MSComm1.PortOpen Then MSComm1.PortOpen = TrueEnd SubPrivate Sub Timer1_Timer()'显示<< 算法一>>结果Text2.Text = Hex(HiByte)Text3.Text = Hex(LoByte)'显示<< 算法二>>结果Text6.Text = Hex(CRC16Hi)Text7.Text = Hex(CRC16Lo)If Text5.Text <> "" Then '十进制转十六进制Text10.Text = Hex(Text5.Text)End IfIf Text11.Text <> "" Then '十六进制转十进制Text12.Text = Val("&H" & Text11.Text)End IfText14.Text = MSComm1.OutBufferCountEnd Sub'========== CRC校验<< 算法二>> =============================================================================== =========Function CRC161(data() As Byte) As String 'CRC计算函数' Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器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 UBound(data)CRC16Lo = CRC16Lo Xor data(I) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7CRC16Hi = 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低位asd = Right("00" + Hex(CRC16Lo), 2) + Right("00" + Hex(CRC16Hi), 2) End FunctionPrivate Sub mscomm_OnComm()End Sub。

合集下载

VB与PLC通信程序(欧姆龙PLC).doc

VB与PLC通信程序(欧姆龙PLC).doc

VB与PLC通信程序(欧姆龙PLC)关于VB的MSCOMM控件可参考相关资料。

通信程序摘要如下:(1)初始化程序mport=2 ’选择COM2Mscomm1.Settings=”9600,N,8,2”’设置通信参数Mscomm1.Inputlen=0 ’读入接收缓冲区全部字符Mscomm1.OutbufferSize=256 ’设置发送缓冲区大小Mscomm1.InbufferSize=512 ’设置接收缓冲区大小Mscomm1.PortOpen=True ’打开COM2(2)发送命令程序比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有:Dim Command, node, begin, number as stringDim Answerlen as integernode=”03”’节点号Command=”RR”’命令为读IR区begin=”0000”’从IR000开始number=10 ’读取长度Answerlen=51 ’计算接收字符串长度进行命令发送和接收应答处理:Dim FCS, I as integerDim s ,f as strings=”@”+node+Commad+begin+numberFCS=0For i=1 to Len(s)FCS=FCS xor Asc(Mid$(s,i,1) ) ’帧校验码FCSNext if=Hex$(FCS)If Len(f)=1 Then f=”0”+fCommfrm.MSComm1.Output=s + f + ”*” + CHR$(13) ’命令帧发送DoDummy=DoEvents()Loop Untill Commfrm.MSComm1.InbufferCount >= Answerlen ’等待应答帧Do tag1= Commfrm.MSComm1.InputLoop Untill Commfrm.MSComm1.InbufferCount=0 ’读完应答帧上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。

VB6.0下MSComm控件实现串口通信

VB6.0下MSComm控件实现串口通信

VB6.0下用MSComm控件实现串口通信MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能,以下先对其属性进行详细的说明后再举一个例子进行说明:1基本属性CommPortO mPort[=value]Object为MSComm控件,value为整数值,标志端口号。

说明:该属性设置并返回通讯端口号,value的值可以设为1-16间的任意数(默认为1)。

在打开端口之前必须先设置CommPort属性,当端口不存在时,如果用PortOpen属性打开它,MSComm控件会产生错误68(即设备无效的错误)。

SettingsObjiect.Setting[=value]Object为MSComm控件,value为字符串类型,表示通讯端口的设置值。

说明:本属性用来设置并返回端口的波特率、奇偶校验位、数据位和停止位参数。

当端口打开时,如果指定的value参数非法,则MSComm控件产生380号(非法属性值)错误。

有效的value参数值由四个设置值组成,有如下格式:“BBBB,P,D,S”,其中BBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。

Value的默认值为:“9600,N,8,1”,下面给出合法的波特率、奇偶校验位、数据位和停止位参数:波特率:110,300,600,1200,2400,4800,9600(默认),14400,19200,28800,38400,56000,57600,115200,128000,256000。

奇偶校验值:E(偶校验,Even)、M(标记,Mark)、N(默认,Default,None)、O(奇校验,Odd)、S(空格,Space)。

数据位值:4,5,6,7,8(默认),9。

停止位值:1(默认),1.5,2。

PortOpenO bject.PortOpen[=value]Object为MSComm控件。

Value为布尔类型,表明通讯端口的状态。

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编写RS_485数据采集程序

用VB编写RS_485数据采集程序

的文件材料的收集、整理、移交工作;二要对施工单位文件材料的形成情况进行质量检查把关,按照监理规程要求,在控制节点进行审核、签署,发现问题及时提出整改。

建设单位:全面负责立项文件、建设用地征地拆迁文件、勘察、测绘、设计文件,工程招投标文件、开工审批文件、财务文件的形成和归档。

为确保项目竣工验收,建议前期组织人员调研项目档案验收程序,明确重点验收范围,编制档案验收文件汇总目录,分项落实到部门和相关人员,负责完整、准确形成档案资料和及时归档。

5结论是否可以与越来越复杂的建井条件挂钩:在复杂条件下,为便于开展工程评价,并为后继工程提供借鉴,对档案管理的要求在提高,原有的档案管理模式不能满足这一要求,在项目档案管理出现管理难度大,形成难,归档难,案卷整理组巻难的问题。

因此,建议在在矿井工程建设各方中增设档案管理人员,分施工单位、监理单位、建设单位三个层面进行控制归档。

个人简介孙洪章(1963~),男,高级工程师,1986年毕业于阜新矿业学院,现在兖煤菏泽能化有限公司从事矿建工作。

(收稿日期:2008-9-19)用VB编写RS-485数据采集程序昆明理工大学国土资源工程学院张明旭黄德镛现场总线和智能仪表的出现标志着工业控制领域进入了网络时代,迅速成为了工业控制的主流。

目前国际上正在使用的现场总线名目繁多,如PROFIBUS、INTERBUS、CAN总线,但是其系统造价相对较高,不太适用于中小型系统的应用。

而RS485串行通信总线以构造简单、技术成熟、造价低廉、便于维护等特点广泛应用于工业控制、仪器、仪表、机电一体化产品等诸多领域。

尤其在数据通信、计算机网络以及工业分布式控制系统中,经常需要采用串行通信来实现远程信息交换。

但是为了对控制串行网络远程采集数据,依然需要为串行通讯网络和智能仪表编写数据采集程序。

本文就简单介绍一个适应RS-485串行网络的数据采集程序。

1RS-485简述电子工业协会EIA于1983年制订并发布RS-485标准,并经TIA-通讯工业协会修订后命名为TIA/EIA-485-A,习惯地称之为RS-485。

VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码

VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码
'<<算法>>
Dim CRC_2() As Byte
Dim v As Integer
ReDim CRC_2(K)
For v = 0 To K
CRC_2(v) = Val("&H" & Text1(v).Text)
Next
'==================================================================================================
'
'Next
'Label35.Caption = Str(Val(Asc(Mid(tmp, 6, 1))) / 10)
'
'
' tmp = Mid$(tmp, 6, 4)
'
'
' Dim strHex As String
' Dim Hex2Dec As Long
' Dim strTmp As String
'a = 0
'tmp = 0
'
'
'
' Do While Len(tmp) < 8
'
' tmp = tmp + MSComm1.Input
' testNO.Caption = testNO.Caption + " " + Str(Hex(Asc(tmp)))
' a = a + 1
' If a >= 3000 Then

VB串口通信程序代码

VB串口通信程序代码

vb中怎样用mscomm控件实现串口通信本问分两部分均来自第一部分jessezappy(晶晶)================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = FalsemPort = 1 '假定是用COM1口' 设定传输速率等,可依照您的需求更改MSComm1.Settings = "9600,N,8,1"MSComm1.PortOpen = True'---------初始化Modem-------------MSComm1.Output = "ATZ"MSComm1.Output = "AT&F"MSComm1.Output = "ATE0"MSComm1.Output = "ATM1"MSComm1.Output = "ATQ0"MSComm1.Output = "ATV0"'--------------------------拨号-------------MSComm1.Output ="ATDT163" '拨163'---------------------------接通后MSComm1.Output ="SDFJDKSJLKFA" '发送字符串'---------------------Private Sub MSComm1_OnComm() '用串口事件捕捉数据..If MSComm1.InBufferCount Then' 通讯埠中假如有资料的话, 则读取进来InStringB = InStringB & MSComm1.Input' 如果资料中有Chr(13) 和Chr(10) 的话, 则显示出来If InStr(InStringB, vbCrLf) Theninstring = instring & InStringBAddText Text3, InStringB, FalseInStringB = ""End IfEnd IfEND SUB'-------------------------挂断--------MSComm1.PortOpen = False '这个挂断方法不能适用所有MODEM,我正在研究...通用办法================================================================================================第二部分:===========================================================================最后借你一篇文章看,作者不是我,里面的不一定都对..'-----------------------------------------------------------VB Mscomm控件应用江苏戚墅堰机车车辆厂设计处(213011) 李秉璋--------------------------------------------------------------------------------Visual Basic 6.0(以下简称VB) 是一种功能强大、简单易学的程序设计语言。

vs2008(VB)与三菱PLC485BD通讯

搞技术,搞不定,很闹心!别人的奉献可以使你明朗,心情愉悦!奉献是快乐的!不要吝啬你千辛万苦摸索出来的技术!与三菱PLC的串行通讯要点PLC测的设置页面(在PLC左侧工程树下点击参数设置,然后写到PLC里)485硬件连接:rs232转485端的A接PLC的485BD上的RDA和SDA(如下图的红线),B接485BD上的RDB和SDB(如下图的白线)。

如果以设置了还不正确,要看看电脑端的串口接好没有,连线有没有短线等。

窗体源码:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadmPort = 1MSComm1.Settings = "9600,E,7,1"MSComm1.Handshaking = None MSComm1.InputLen = 0MSComm1.InBufferCount = 0MSComm1.OutBufferCount = 0MSComm1.PortOpen = TrueEnd Sub按钮及文本显示源码:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickMSComm1.InBufferCount = 0MSComm1.OutBufferCount = 0MSComm1.InputLen = 0Dim fanhui As StringDim zhuangtai As Stringzhuangtai = Chr("5") + "05FFBRAX00010140"MSComm1.Output = zhuangtaiDoApplication.DoEvents()Loop Until MSComm1.InBufferCount = 9fanhui = MSComm1.InputText1.Text = "x001状态" + "------" + "数据为:" + fanhui End Sub注意:VB6.0用chr(5)表示,但是要用chr("5")表示,否则出错。

应用MSComm控件实现计算机与PLC间的串行通讯

应用MSComm控件实现计算机与PLC间的串行通讯摘要本文应用S7-200系列PLC的RS-485接口,通过PC/PPI电缆与计算机的RS-232接口连接,软件方面应用Visual Basic提供的串行通讯控件(MSComm)实现PC机对可编程序控制器的监控与管理。

本文主旨在于探讨应用可视化编程语言实现PC机与PLC网络之间数据通讯的技术以及实现方案,利用PC机的管理与监控功能实现对PLC的自动化控制。

关键词可编程序控制器;串行通讯;中断0 引言可编程序控制器(PLC)专门用于工业控制,它的核心是以微处理器的结构为基础,在硬件结构上和普通的计算机基本一致。

它在基本的计算机结构当中,加入了传统的继电器控制系统,使其具有了高度的可靠性,更好的适应工业现场的环境,而且具备了强大的联网处理功能,广泛地应用在工业控制生产过程中。

微软的Visual Basic提供了MSComm控件,通过硬件的串行端口传送和接收数据,实现了PC机与PLC之间的通信,为可视化程序对PLC的控制提供了可能。

本文基于西门子公司生产的S7-200型PLC,应用MSComm控件,编写了计算机与PLC通讯程序,包括了上位机和下位机相应的程序代码。

提出了应用编程语言实现PC/PLC网络之间数据通信的软件解决方案,实现了用PC机对PLC 的监控及控制。

1 PLC与计算机间的通讯S7-200型PLC可以连接编程器、人机接口设备,甚至连接其他的PLC或PC机,组成PLC网络,可以实现PC与PLC、PLC与PLC的各种通信功能。

同时可以应用PC的管理功能实现对PLC的编程、监控和联网的功能。

S7-200系列PLC具有9针的RS-485接口,可以通过PC/PPI电缆与计算机连接,PLC之间可以通过SINEC-L2接口连接成PLC网络。

S7-200系列PLC主要有两种通信模式:一种为点对点(PPI)通信协议模式,用在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个停止位。

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档