VB与PLC通信程序(欧姆龙PLC)
VB与PLC通信程序(欧姆龙PLC).doc
![VB与PLC通信程序(欧姆龙PLC).doc](https://img.taocdn.com/s3/m/ba4b090652ea551810a68758.png)
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 ’读完应答帧上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。
vb与欧姆龙OPC服务器编程实例(读取PLC100个内存的vb源代码)
![vb与欧姆龙OPC服务器编程实例(读取PLC100个内存的vb源代码)](https://img.taocdn.com/s3/m/d0bd8b33a32d7375a41780a4.png)
Option ExplicitOption Base 1 ' All OPC Automation Arrays start with 1Dim MyOPCServer As OPCServer ' OPCServer ObjectDim MyGroups As OPCGroups ' OPCGroups Collection ObjectDim WithEvents MyGroup As OPCGroup ' OPCGroup ObjectDim MyItems As OPCItems ' OPCItems Collection ObjectDim MyItemServerHandles() As Long ' Server Handles for ItemsDim MyTID As Long ' Transaction ID for asynchronous calls Private Sub Command1_Click()Dim Errors() As LongCall MyItems.Remove(100, MyItemServerHandles, Errors)MyGroups.RemoveAllSet MyGroup = NothingSet MyGroups = NothingMyOPCServer.DisconnectSet MyOPCServer = NothingEnd SubPrivate Sub Command2_Click()PFAsyncWriteCommandEnd SubPrivate Sub Command3_Click()Form_LoadEnd SubPrivate Sub Form_Load()MyTID = 1Set MyOPCServer = New OPCServerCall MyOPCServer.Connect("OMRON.OPC.2")Set MyGroups = MyOPCServer.OPCGroupsMyGroups.DefaultGroupUpdateRate = 500MyGroups.DefaultGroupIsActive = TrueSet MyGroup = MyGroups.Add("Group1")MyGroup.IsSubscribed = TrueMyGroup.IsActive = TrueMyGroup.UpdateRate = 500Dim ErrorFlag As BooleanDim ItemObj As OPCItemDim ItemIDs(100) As StringDim ItemClientHandles(100) As LongDim Errors() As LongErrorFlag = FalseSet MyItems = MyGroup.OPCItemsDim m As IntegerFor m = 0 To 3Text1(m).ForeColor = vbRedText1(m).FontSize = 15Text2(m).ForeColor = vbRedText2(m).FontSize = 15NextFor m = 4 To 99Text1(m).ForeColor = vbBlueText1(m).FontSize = 15NextFor m = 1 To 100ItemIDs(m) = "Device.Group1.Tag" & CStr(m)ItemClientHandles(m) = mNextCall MyItems.AddItems(100, ItemIDs, ItemClientHandles, MyItemServerHandles, Errors)End SubPrivate Sub MyGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)On Error GoTo ErrorHandler '订阅方式回馈信息存储Dim i As LongFor i = 1 To NumItemsIf ClientHandles(i) > 0 And ClientHandles(i) < 101 ThenIf Qualities(i) = 192 Thendata1(ClientHandles(i)) = ItemValues(i)Else' MsgBox GetQualityText(Qualities(i))End IfElseMsgBox "DataChange Item " + Str$(i) + " has invalid Client Handle ", vbCriticalEnd IfNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "OnDataChange", vbCritical, "ERROR"End SubPrivate Sub Timer1_Timer()Dim i As IntegerFor i = 1 To 100Text1(i - 1).Text = data1(i)Next iEnd SubPublic Sub PFAsyncWriteCommand() '异步写入命令On Error GoTo ErrorHandlerDim i, j As LongDim Values(4) As VariantDim Errors() As LongDim CID As LongDim AsyncHandles(4) As LongFor j = 1 To 4AsyncHandles(j) = MyItemServerHandles(j)Values(j) = Text2(j - 1).TextNextMyTID = MyTID + 1Call MyGroup.AsyncWrite(4, AsyncHandles, Values, Errors, MyTID, CID)For i = 1 To 4If Not Errors(i) = 0 Then MsgBox "Item " + Str$(i) + " FAILED. Error Code = " + Str$(Errors(i)), vbCritical NextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Writing Items Asyncronous", vbCritical, "ERROR"End SubPrivate Sub MyGroup_AsyncWriteComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, Errors() As Long)On Error GoTo ErrorHandler '异步写命令回馈信息Dim i As LongFor i = 1 To NumItemsIf Not Errors(i) = 0 Then MsgBox "AsyncWriteComplete Item Clienthandle = " + Str$(ClientHandles(i)) + " FAILED. Error Code = " + Str$(Errors(i)), vbCriticalNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Async Write Complete", vbCritical, "ERROR"End Sub。
VB 与 PLC 通讯
![VB 与 PLC 通讯](https://img.taocdn.com/s3/m/098cc18ecc22bcd126ff0c62.png)
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的通信详解概要](https://img.taocdn.com/s3/m/eec3481410661ed9ac51f315.png)
Vb6.0与三菱PLC的通信串行通信程序时,有两种方法,一种是用Windows API函数,另一种是用VB支持的通信控件MSCOMM.OCX。
使用MSCOMM.OCX控件编程方便,具有更完善的发送和接收功能。
这里采用了MSCOMM.OCX控件。
项目选用三菱FX2N-64MR型PLC,SC-09电缆作为计算机与PLC通信的连线。
连接电缆的9针端连接在计算机串口上,另一端连接在PLC的RS-422编程口。
通信格式:一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码—ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。
STX(CHR(2))和ETX(CHR(3))分别表示该字符帧的起始标起和结束标志。
(1) 起始字元STX:ASCII码的起始字元STX对应的16进制数位0x02。
无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。
(2) 命令号码:为两位16进制数。
所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。
在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。
(3) 元件首地址:对应要操作的元件的相应的地址。
如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC。
(4) 元件个数:一次读取位元件或字元件的数量。
(5) 结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。
无论命令信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束。
(6) 校验码(Checksum):校验码是将STX-ETX之间的ASCII字元的16进制数值以“LRC(Longitudinal Redunda ncy Check)”法计算出1个Byte长度(两个16进制数值00-FFH)的校验码。
当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确。
基于VB6.0的欧姆龙PLC与计算机的通信
![基于VB6.0的欧姆龙PLC与计算机的通信](https://img.taocdn.com/s3/m/a6174783680203d8ce2f24fe.png)
1 硬 件 连 接
计算机 作为上位 机 ,P C作 为下位机 ,它们之 L 问的连接见 图 1 。欧姆龙公 司的 C 0 H系列 P C配 20 L
命 令 。在图 2中 ,设 备号指 定与上 位计算机 通信 的
P C( 20 L C 0 H系列 P C是在 D 6 8 D 6 3 M6 4 、 M6 5 中设置
字 符 串或 字节 数组 。
( Ip t d :设置 从缓 冲区读取数 据的格 6) n uMo e
式。
设置 命令参数 。F CS是 校验码 ,它是 为提 高通信 的 可靠性设置 的 ,它将一 条指令 中从 @ 开始到正文结
( Ip te 7) n uL n:设置 和返 回 Ip t n u 每次读 出的 字 节数 。 ( IB f r o n:设置 和返 回接收缓 冲区中 8) n uf C u t e 的字节数 ,设 为 0时 ,清 空接 收缓 冲 区。 32 控 件参数初 始化 . 本 例 以某公 司 的包封 机控制 系统 的 P C和计 L 算机通信 为例 。用 VB .编写与欧姆龙系列 P C的 60 L 计 算机通信程序 的界 面 ,如图 4所示 。除图 中显 示 的命 令按 钮 和接 收 文本 框外 ,还 需
0 引言
P C以其可靠性 高 、抗 干扰 能力强 、编程简单 L 而在现代 电器控制 系统 中得到 了广泛 的应用 。V . B6 0
置有专 门的 R ・3 C通 信 口,因此不 必配置专 门的 S2 2
上 位链接模 块 ,用电缆将 其 与计算机 的 串行 口相 连 即 可构 成一 个 简单 的监 控 网络 。
P C的设备号 ) L 。识别码是命令代码 ,占有两个字节 ,
P c
如何通过VB实现PC机与PLC的以太网通信plc
![如何通过VB实现PC机与PLC的以太网通信plc](https://img.taocdn.com/s3/m/71fa11cb0722192e4436f6df.png)
如何通过VB实现PC机与PLC的以太网通信- plc此控件对于用户在运行时不行见,供应了一个简洁的途径访问TCP 及UDP网络服务而无需了解底层细节,使用时你只需设置属性、在恰当的时候调用它供应的方法即可。
主要属性有:BytesReceived:返回当前缓冲区中的字节数量,我们可以使用GetData 方法以接收数据。
只读且设计时不行用。
LocalHostName:返回本机名字符串,设计时不行用。
LocalIP:返回以(xxx.xxx.xxx.xxx)格式表达的IP地址串。
设计时不行用,运行时只读。
LocalPort :本机使用接收端口可读写,设计时可用,Long型。
对于客户,假如无需指定端口,则用端口0发送数据。
在此状况下,控件将随机选择一个端口。
在一个连接确定后,为TCP的端口。
对于服务器,指用于监听的端口。
如设置为0,则用随机数。
在调用Listen 方法后,该属性自动包含用到的端口。
端口0总是用于在两计算机间建立动态连接。
客户期望通过端口0获得一个随机端口以”回调”连接服务器。
Protocol :套接字类型,为TCP或UDP二者之一,缺省为TCP类型。
设置为sckTCPProtocol表示TCP协议sckUDPProtocol表示UDP协议。
在此属性被重置之前需用Close方法关闭之。
RemoteHost:发送或接收数据的主机,你可供应主机名如:FTP://,或一IP地址串,例如“100.0.1.1”。
RemoteHostIP:远程主机的IP地址。
对于客户程序,在连接确定后使用Connect方法,此属性包含远程主机的IP名串。
对于服务器程序,在引入连接需求后(Connection Request 大事),此属性包含IP串。
当使用UDP套接字,在Data Arrival大事发生后,此属性为发送UDP数据的机器IP地址串。
RemotePort:连接套接字端口值。
例如通常HTTP应用使用80端口,FTP则使用21。
VB实现PC与欧姆龙PLC通讯的串口编程
![VB实现PC与欧姆龙PLC通讯的串口编程](https://img.taocdn.com/s3/m/b5d56d4ecbaedd3383c4bb4cf7ec4afe04a1b1d1.png)
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与PLC的通信
![VB与PLC的通信](https://img.taocdn.com/s3/m/3e7fd2d87f1922791688e863.png)
利用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只电容即可。
VB与PLC通讯程序教学
![VB与PLC通讯程序教学](https://img.taocdn.com/s3/m/320d7104bed5b9f3f90f1c1e.png)
VB与PLC通讯程序教学为什么要学习编制VB与PLC通讯程序,学会编制VB与PLC通讯程序有什么用呢?简单地说:省成本!小型的控制系统触摸屏即可胜任,5.7寸的屏价格不一。
便宜也就一千多点,这个时候用VB做PLC 的上位机控制系统当然是不合算。
当控制系统要求上位机与PLC的通讯量很大时,触摸屏已经不能胜任了,需要用到组态软件。
组态软件确实是好东西,但是我们小家小业的,还是省着点好。
此时VB就派上用场,用VB在电脑上编制一套PLC通讯程序,如果我们的脑力劳动暂不计成本的话,一台电脑几千元基本就搞定了上位机与PLC的通讯。
怎么才能学会用VB编制PLC的上位机通讯程序呢?1、买一个VB6.0中文企业版的软件(VC,DELPHI,VB三合一的光盘也不过二十元左右)2、买本VB入门基础书,边看边练习做些小程序(别不舍得花钱,网上虽然可以下载,但是看起来并不方便,影响您的学习进度)3、VB看几天就可以了,VB与PLC通讯只需要应用几个简单的VB控件而已。
如文本框用来读、写PLC寄存器的值,按钮用来置、复位PLC位元件,文字标签用来显示PLC位元件的ON、OFF状态,三个控件应用就可以学会编制VB与PLC通讯程序了。
您先学会了VB与PLC通讯方法,后期您再努力学好VB。
(真正用到工程上,VB要学很长时间呢)4、查找一些有关通讯方面的书籍翻翻,了解一下通讯格式是怎么回事。
比如说波特率,停止位,开始位,校验位,数据位。
看不懂没关系,先记住这些概念,在学习编制VB与PLC通讯程序的过程中您会理解这些(实践是最好的老师)5、找一些别人做好的VB与PLC通讯程序看,别幻想您自己做出来,除非您基础雄厚,时间也雄厚(时间是金钱,参考是捷径。
)6、找一个朋友帮忙指导,还是不要幻想自己看懂找到的VB与PLC通讯程序,除非您基础雄厚,时间也雄厚(好学生也需要进学校学习,听课比自学学得好又快是真理。
)7、学懂了VB与PLC通讯的原理与程序编制方法后,千万别因满足而停止,动手去编制自己的VB与PLC通讯程序。
基于VB6.0的上位机与PLC实时通信技术
![基于VB6.0的上位机与PLC实时通信技术](https://img.taocdn.com/s3/m/35493f487dd184254b35eefdc8d376eeaeaa17f5.png)
基于VB6.0的上位机与PLC实时通信技术一、引言在工业自动化控制领域,上位机与PLC实时通信技术扮演着十分重要的角色。
上位机是指在控制系统中完成对PLC或其他控制设备数据采集和监控的计算机。
PLC (Programmable Logic Controller)是可编程逻辑控制器的缩写,其主要作用是用来控制生产现场的设备以实现自动化操作。
上位机与PLC实时通信技术可以让上位机快速准确地与PLC交换数据,从而实现对生产工艺的实时监控和管理。
本文将重点介绍基于VB6.0的上位机与PLC实时通信技术的实现方法与应用。
二、基于VB6.0的上位机与PLC实时通信技术的实现方法1. VB6.0编程环境的搭建要实现基于VB6.0的上位机与PLC实时通信技术,首先需要在计算机上安装VB6.0开发环境。
然后,创建一个新的VB6.0项目,选择“标准EXE”模板。
2. 使用通讯控件在VB6.0中,实现与PLC的通信可以使用通讯控件。
常用的通讯控件包括MSComm控件和Winsock控件。
MSComm控件用于串口通讯,而Winsock控件用于网络通讯。
根据实际情况选择合适的通讯控件,然后在VB6.0项目中引用相应的控件库。
3. 编写通讯程序在VB6.0中,通过使用通讯控件,可以编写与PLC通讯的程序。
首先需要设置通讯控件的属性,包括端口号、波特率、数据位、停止位等。
然后编写相应的事件处理程序,如接收数据事件、发送数据事件等,以实现与PLC的数据交换。
4. 数据解析与显示通过VB6.0与PLC通讯后,上位机可以接收到PLC发送的数据。
为了实现实时监控,需要对接收到的数据进行解析和处理,然后将其显示在上位机界面上。
可以通过VB6.0提供的界面设计工具,实现数据的动态显示和更新。
5. 错误处理与安全性在实际应用中,基于VB6.0的上位机与PLC实时通信技术需要考虑通讯的稳定性和安全性。
在编写通讯程序时,需要实现错误处理机制,对通讯中可能出现的异常情况进行处理,确保通讯的稳定性。
基于VB通信控件MSComm实现计算机与欧姆龙PLC串行通信编程的研究与应用
![基于VB通信控件MSComm实现计算机与欧姆龙PLC串行通信编程的研究与应用](https://img.taocdn.com/s3/m/c7d16e68a45177232f60a2f9.png)
图7 响应帧结构示意图
帧 结 构 解 析: @ :返回命令头; 节点号:有效值为 0 0 — 3 1 ,返回数据的 P L C 节点号; 头代码:P L C 的命令代码; 尾代码:返回命令完成状态码; 接收文本:在有数据时返回的数据; F C S:帧检查顺序代码; 终止符:“* ”号和回车符“C R ”。 举 例 如 下: 读 H 区响应帧结构如图 8 所示。
0 引 言 计算机串行通信是计算机与控制设备( P L C ) 进行数据
传送的一种通信方式,也是实现工业自动控制经常用到的 通信模式。每一种通信方式都严格约定了与其对应的通信 协议。要确保计算机与 P L C 之间能正常通信,就必须遵照 P L C 通信协议编写通信程序。本文将围绕如何使用V i s u a l Basic(简称 VB )的 M S C o m m 通信控件编写计算机与欧姆龙 P L C 串行通信程序进行阐述。
可使用。现将控件的加载及属性设置方法进行介绍。 2.2.1 将MSComm控件加载到应用程序中
在 V B 集成开发环境(I D E )中选择“工程”选项卡中的 “部件”子菜单进入控件选择页面,如图 1 所示。
1 串行通信 串行通信在工业系统控制的范畴中一直占据着极其
重要的地位,串行端口(R S - 2 3 2 )是计算机上的标准配置, 常用于连接调制解调器来传输数据,在计算机的硬件设备 管理器中可以看到,定义为C O M 1 、C O M 2 等。常用的串行通 信方式有两种,分别是RS-232 和RS-485,本文以RS-232 方 式为例进行介绍。
图5 命令帧结构示意图 帧 结 构 解 析:
4 计算机与P L C串行通信程序实例 4.1 通信主程序的设计架构
VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码
![VB控件Mscomm控件与PLC进行RS485(Modbus)通讯源码](https://img.taocdn.com/s3/m/49a3cea65fbfc77da269b1ab.png)
V B控件M s c o m m控件与P L C进行R S485(M o d b u s)通讯源码本人用的是ModbusRTU通讯模式,通过计算机串口转RS485与外围设备通行通讯,读写外围设备指定地址里的数据,从而达到自动化控制远端设备。
DimHiByteAsByteDimLoByteAsByteDimCRC16LoAsByteDimCRC16HiAsByteDimReturnData(1)AsByteDimKAsIntegerDimCmdLenthAsIntegerPrivateSubCommand1_Click()K=Text9.Text'写6个字节Text13.Text=""'===========数组赋值输入代码=============================================================================== ========'<<算法一>>DimWriteStr()AsByteDimuAsIntegerReDimWriteStr(K+2)Foru=0ToKWriteStr(u)=Val("&H"&Text1(u).Text)Next'<<算法二>>DimCRC_2()AsByteDimvAsIntegerReDimCRC_2(K)Forv=0ToKCRC_2(v)=Val("&H"&Text1(v).Text)Next'============================================================================== ====================CallCRC161(CRC_2())CallCRC16(WriteStr(),K)MSComm1.InBufferCount=0'==========显示发送代码=============================================================================== =========DimmAsIntegerForm=0To23Ifm<=KThenText8(m).Text=Hex(WriteStr(m))ElseText8(m).Text=""EndIfNext'============================================================================== ====================WriteStr(K+1)=LoByteWriteStr(K+2)=HiByte'发送代码Text4.Text=""DimgAsIntegerForg=0ToK+2Text4.Text=Text4.Text+""+Hex(WriteStr(g))Next'写命令发送后,当接收到8个字节时中断CmdLenth=8MSComm1.RThreshold=CmdLenthMSComm1.Output=WriteStrEndSubPrivateSubCommand2_Click()EndEndSubPrivateSubCommand3_Click()Label34.Caption="="Text13.Text=""K=Text9.Text'写6个字节'===========数组赋值输入代码=============================================================================== ========'<<算法>>DimCRC_2()AsByteDimvAsIntegerReDimCRC_2(K)Forv=0ToKCRC_2(v)=Val("&H"&Text1(v).Text)Next'============================================================================== ====================CallCRC161(CRC_2())CallCRC16(WriteStr(),K)MSComm1.InBufferCount=0'==========显示发送代码=============================================================================== =========DimmAsIntegerForm=0To23Ifm<=KThenText8(m).Text=Hex(WriteStr(m))ElseText8(m).Text=""EndIfNext'============================================================================== ====================WriteStr(K+1)=LoByteWriteStr(K+2)=HiByte'发送代码Text4.Text=""DimgAsIntegerForg=0ToK+2Text4.Text=Text4.Text+""+Hex(WriteStr(g))Next'读命令发送后,当接收5+SendStr(5)*2个字节时产生中断CmdLenth=5+WriteStr(5)*2MSComm1.RThreshold=CmdLenthMSComm1.Output=WriteStr'发送命令'****************************************************************************** **********************************************************'****************************************************************************** *************************************'****************************************************************************** **********************************************************'DimsAddrAsString''DimCheckStringAsString'DimCheckCodeAsString'DimCmdCodeAsString'DimSumAsInteger'DimaAsInteger'DimtmpAsString'a=0'tmp=0''''DoWhileLen(tmp)<8''tmp=tmp+MSComm1.Input'testNO.Caption=testNO.Caption+""+Str(Hex(Asc(tmp)))'a=a+1'Ifa>=3000Then'MSComm1.PortOpen=False'ExitFunction'ExitDo'EndIf'Loop'Label33.Caption=tmp'Text16.Text=Len(tmp)'DimnsAsInteger'Forns=1ToLen(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)'''DimstrHexAsString'DimHex2DecAsLong'DimstrTmpAsString'DimlongTmpAsLong'DimlongDecAsLong'DimintLenAsInteger'Dimn1AsInteger''strHex=Right$(tmp,2)+Left$(tmp,2)''intLen=Len(strHex)'Forn1=1TointLen'strTmp=Mid(strHex,n1,1)'SelectCaseAsc(strTmp)'Case48To57'longTmp=Val(strTmp)'Case65To70'longTmp=Asc(strTmp)-55'CaseElse'Hex2Dec=0''ExitFunction'EndSelect'Text13.Text=Text13.Text+"+"+Str(Asc(strTmp))'longDec=longDec+longTmp*16^(intLen-n1)'Nextn1''Hex2Dec=longDec'Text13.Text=Hex2Dec'****************************************************************************** **********************************************************'****************************************************************************** *************************************'****************************************************************************** **********************************************************EndSubPrivateSubMSComm1_OnComm()DimNeAsIntegermEventCasecomEvReceiveDimBufferAsVariantMSComm1.InputMode=comInputModeBinaryMSComm1.InputLen=0Buffer=MSComm1.InputForNe=LBound(Buffer)ToUBound(Buffer)Text13.Text=Text13.Text&"+"&Buffer(Ne)Label34.Caption=Buffer(3)&""&Buffer(4)NextNeCaseElseEndSelectBeepEndSubPrivateSubCommand4_Click()EndSubPrivateSubCommand5_Click()Label34.Caption="="EndSubPrivateSubForm_Load()MSComm1.Settings="9600,N,8,1"mPort=1MSComm1.SThreshold=0IfNotMSComm1.PortOpenThenMSComm1.PortOpen=TrueEndSubPrivateSubTimer1_Timer()'显示<<算法一>>结果Text2.Text=Hex(HiByte)Text3.Text=Hex(LoByte)'显示<<算法二>>结果Text6.Text=Hex(CRC16Hi)Text7.Text=Hex(CRC16Lo)IfText5.Text<>""Then'十进制转十六进制Text10.Text=Hex(Text5.Text)EndIfIfText11.Text<>""Then'十六进制转十进制Text12.Text=Val("&H"&Text11.Text)EndIfText14.Text=MSComm1.OutBufferCountEndSub'==========CRC校验<<算法二>>=========================================================================== =============FunctionCRC161(data()AsByte)AsString'CRC计算函数'DimCRC16LoAsByte,CRC16HiAsByte'CRC寄存器DimCLAsByte,CHAsByte'多项式码&HA001DimSaveHiAsByte,SaveLoAsByteDimIAsIntegerDimFlagAsIntegerCRC16Lo=&HFFCRC16Hi=&HFFCL=&H1CH=&HA0ForI=0ToUBound(data)CRC16Lo=CRC16LoXordata(I)'每一个数据与CRC寄存器进行异或ForFlag=0To7CRC16Hi=CRC16Hi\2'高位右移一位CRC16Lo=CRC16Lo\2'低位右移一位If((SaveHiAnd&H1)=&H1)Then'如果高位字节最后一位为1CRC16Lo=CRC16LoOr&H80'则低位字节右移后前面补1EndIf'否则自动补0If((SaveLoAnd&H1)=&H1)Then'如果LSB为1,则与多项式码进行异或CRC16Hi=CRC16HiXorCHCRC16Lo=CRC16LoXorCLEndIfNextFlagNextIDimReturnData(1)AsByteReturnData(0)=CRC16Hi'CRC高位ReturnData(1)=CRC16Lo'CRC低位asd=Right("00"+Hex(CRC16Lo),2)+Right("00"+Hex(CRC16Hi),2)EndFunctionPrivateSubmscomm_OnComm()EndSub。
VB与PLC通讯示例
![VB与PLC通讯示例](https://img.taocdn.com/s3/m/cb33b4f24693daef5ef73d9f.png)
2. 啤酒稀释的人机操作界面:
人机操作主要用来输入啤酒浓度数据、操作命令,直观显示各种流量数据并记录偏差曲线,界面图如下:
3. 硬件配置
本例子中上位机PC选用联想奔腾Ⅱ品牌机,外加RS232转RS485通讯转换卡。下位机PLC选用三菱FX2N-16MR,另加模拟输入模块FX2N-2AD 和模拟输出模块FX2N-2DA各一块,外加一个485串口通讯模块PC-485BD。
表格中粗体字为需要求和效验的部分;
和效验为每一项的ASCII值的总和转换成十六进制后,取其低两位;
站号、PLC号、元件数量、和效验都是以十六进制表示;
等待延时为0-150毫秒,以十六进制0H-FH表示,如100ms为AH。
1) 批量读出位元件—BR指令格式
1 2 3 4 5 6 7 8 15 16 17
PC侧: ENQ 站号 PLC号 BR 延时 首地址 数量 和校验 ACK 站号 PLC号
PLC侧: STX 站号 PLC号 数据 EXT 和校验
9 10 11 12 13 14
2) 计算出加水量的百分比 [(B-A) / A]*100% ;
3) 根据此百分比和高浓酒的瞬时流量,计算出脱氧水要达到的流量;
4) 比较水的瞬时流量和计算出的流源自,来控制水调节阀的开度,使水瞬时流量等于计算流量。
由于酒和水的瞬时流量是变化的,所以3)、4)步要反复进行。以上所有的计算功能和PID调节功能都由PLC完成。
cha = Val("&H" & iNum) * 4 ''数据寄存器的值为十六进制表示,占4个字符
Case "M", "X", "Y" ''查询继电器触电的值
基于VB6.0的欧姆龙PLC与计算机的通信
![基于VB6.0的欧姆龙PLC与计算机的通信](https://img.taocdn.com/s3/m/93f9ec508f9951e79b89680203d8ce2f006665e0.png)
基于VB6.0的欧姆龙PLC与计算机的通信
高玉新;高元学
【期刊名称】《昆明冶金高等专科学校学报》
【年(卷),期】2005(21)5
【摘要】介绍了欧姆龙C200H系列PLC串行接口的通信协议,并以VB6.0作为开发工具实现了PLC与计算机的串行通信.
【总页数】3页(P56-58)
【作者】高玉新;高元学
【作者单位】昆明理工大学,机电工程学院,云南,昆明,650093;山东清华同方鲁颖电子股份有限公司,山东,临沂,276300
【正文语种】中文
【中图分类】TP273
【相关文献】
1.VB6.0平台下欧姆龙PLC与计算机串行通信的实现 [J], 赵璐;孙焱
2.基于VB6.0的欧姆龙PLC与计算机的通信 [J], 鞠阳军;高玉新
3.基于VB6.0的S7-2.00 PLC与上位计算机串行通信的实现 [J], 周志忠;郑春娇;朱延枫
4.Vb6.0实现PC机与PLC通信(欧姆龙CPM2) [J], 张曦明;毛书贵;韩宗奇
5.基于VB通信控件MSComm实现计算机与欧姆龙PLC串行通信编程的研究与应用 [J], 张红军;韦晓明;苏锐生
因版权原因,仅展示原文概要,查看原文内容请购买。
VB上位机与PLC通信
![VB上位机与PLC通信](https://img.taocdn.com/s3/m/74df9259804d2b160b4ec0f8.png)
随着现代信息技术的发展以及计算机网络的广泛应用,计算机通信技术已经日趋成熟。
作为传统的计算机通信方式的串行通信,由于具有线路简单、应用灵活、可靠性高等一系列优点长期以来获得了广泛的应用。
计算机串行通信在数据财经、数据通信、故障检测、计算机远程监控等方面有广泛的实用价值,特别在Windows下的串口通信可以充分利用Windows下的软件资源优势,实现多任务条件下对外部的数据传输、信息收集和处理。
在本系统中,我们采用了性能/价格比较高的计算机构成厂级的监控工作站。
在PLC与上位计算机之间采用RS-485和RS-232C标准通信接口进行通信。
在两级计算机控制系统中,最不稳定的环节就是上位机。
为了保证系统的稳定性,避免因上位机的故障导致系统控制失灵,所有采集到的信号都反馈到PLC当中。
上位机需要通过串行通信取得所需的数据信息,并通过串行通信将必要的控制信息和参数设置信息写入PLC 的数据存储区。
因此,串行通信作为上位机和下位机联系的唯一方式,在整个系统中具有非常重要的作用。
1.1上位机与PLC间的串行通信计算机与计算机或计算机与外部设备之间的数据传输和交换的方式主要有串行通信和并行通信两种方式,其中串行通信指的是数据逐位传输的方式。
由于串行通信方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。
1.1.1串行通信串行通信方式又可分为两种:同步串行通信方式和异步串行通信方式。
1.同步串行通信方式:同步串行通信是以数据块(字符块)为信息单位传送,每帧信息可以包含很多字符。
同步通信要求通信双方以相同的速率进行,而且要准证确协调,通常通过共享一个时钟或定时脉冲源保发送方和接收方准确同步。
这种通信方式的效率较高,但是对时钟同步要求非常严格,成本较高。
2.异步串行通信方式:异步串行通信以字符为信息单位传送。
双方需要遵守异步通信协议,以字符为数据单位,发送方传送字符的时间间隔不确定。
欧姆龙plc用vb实现通讯
![欧姆龙plc用vb实现通讯](https://img.taocdn.com/s3/m/ce8a208884868762caaed5f1.png)
基于VB的上位机与PLC的串行通信收藏此信息打印该信息添加:佚名来源:未知1 引言在现代控制系统中,pc机作为上位机负责系统管理、状态监控、信息处理和打印报表等工作,plc作为下位机进行面向现场的实时控制已成为一种典型的系统结构。
因此,pc机与plc之间的通信问题便成了系统能否实现的关键。
串行通信以其接线简单、容易实现的特点得到了广泛的应用。
visual basic编程软件简单易学、功能强大,利用它可以很方便的实现pc机与plc间的串行通讯。
本文以omron公司的cpm2a plc为例,介绍了利用vb6.0实现pc机与plc串行通讯的具体方法。
omron公司的cpm2a plc支持host-link通信协议,可以与上位计算机进行通信。
使用host-link通信协议构成的通信网络,可以很方便的实现上位pc对下位plc的实时监控。
2 原理设计2.1 系统结构系统结构如图1所示,计算机作为上位机,plc作为下位机,因omron cpm2a本身带有rs-232串口,因此,利用rs-232电缆将其与pc机的串口(com1或com2)相连,便构成了一个1:1的简单的通讯系统[1]。
图1 系统结构2.2 host-link通信协议[2]omron公司的host-link通信系统是由上位计算机(ibm pc或兼容机)通过安装在各台p lc上的host-link单元连接多台plc构成的网络。
上位机对系统中的plc进行集中管理与监控,通过与host link单元的通信,可以编辑或修改各台plc的程序,实时监控其运行过程,实现自动化系统的集散控制。
对于小型plc,也可以通过其rs 232c通信端口进行链接。
系统使用host-link通信协议进行通信,上位机具有传送优先权,总是首先发出命令并启动通信,host link单元收到命令交由plc执行,然后将执行结果返回上位机,二者以通信帧为单位,轮流交换数据。
通信时一组传送的数据称为“块”,它是命令或响应的单位,从上位机发送到host -link单元的数据块称为命令块,反过来,从host- link单元发送到上位机的数据块称为响应块。
用VB实现上位机与OMRONPLC串行通讯
![用VB实现上位机与OMRONPLC串行通讯](https://img.taocdn.com/s3/m/583b9211227916888486d7ee.png)
上位机到 PLC 命令格式
4. 1 在 VB中添加控件
在窗体中添加 MSComm 控件 MSCommSet 和一 个时钟控件 Timerl,时钟控件用来处理通信超时。在 使用 MSComm 控件之前要进行初始化, 建立起与串 行端口的连接。在通信控件的属性页中设置其属性, 要保证和 PLC 通讯参数一致。
块。多点通信时,可作为单帧发送的最大数据块为
终止符— ——设置 “*” 和 “回车”(CHR
131 个字符,因此当一个数据块含有 132 或更多个 $(13))两个字符表明命令结束。当 PLC 收到上位
数据块时,要分成两帧或多帧发送。每个数据块都 机的命令后,会以下述格式应答。
以设备号及标题开始,以校验码(FCS)及结束符结 PLC到上位
2. 2 VB介绍
VISUAL BASIC 6.0 中提供了一种实现串口通 讯的 MSComm 控件。该控件可完成对串口的读写工 作,从而实现与 PLC 的通讯,为此需正确设置它的 一些属性。MSComm 控件的属性有许多,其中一些需 要在编程时设置,另一些则取默认值即可,具体置方 法可参见相关资料。MSComm 控件有两种通信方式, 查询方式和事件驱动方式。事件驱动法:OnComm 事 件是 MSComm 控件提供的唯一的事件, 当有数据到 达端口或端口状态发生改变或通信错误产生时,都 将触发 OnComm 事件, 以捕获和处理这些通信事件 和通信中产生的错误,通过查询 CommEvent 属性值,
2. 1 PLC介绍
OMRON 可编程控制器 SYSMAC CP1H 是最新 的超高速的一体化紧凑型 PLC。它整合了 CPM2A 和 CJ1 系列 PLC 的优点。内置数字 I/O、高速计数、 脉冲输出、模拟输入和输出功能,提供了极大的灵活 性。编程电缆只需要标准的 USB 线缆,使用快捷方 便。配备与 CS/CJ 系列共通的体系结构,与以往产品 CPM2A 40 点输入输出型尺寸相同,但处理速度可 达到约 10 倍的性能。CP1H PLC 提供了两个通讯口, 可 进 行 RS- 232C 通 信 和 RS- 422A/485 通 信 。 将 CPU 单元前面的拨动开关 SW4 (若选用串行端口 1)或者 SW5(若选用串行端口 2)设定为 OFF(出 厂时设定)。并且将串口设置中的模式设为 host link 模式。RS232 端口根据 PLC 系统设定的串行端口设 定的值进行动作。初始值:高位链接(9600 位 /s、启 动位 1 位、数据长 7 位、偶数校验、结束位 2 位)。
欧姆龙plc网络与通讯
![欧姆龙plc网络与通讯](https://img.taocdn.com/s3/m/4ced2b63915f804d2b16c17e.png)
欧姆龙plc网络与通讯1、引言近年来,plc的网络应用日益广泛,组成更高级的集散控制系统甚至整个工厂的自动化,已成为工业现代化的趋势,实现远程连接和通信成为了PLC的基本性能之一。
而PLC网络结构复杂,技术难度大,投资较高,给用户在开发应用造成了一定的困难。
OMRON公司的PLC较早投入我国市场,在我国工控领域应用较为广泛,掌握其PLC的网络技术和通信方法,对进一步推广PLC的应用,提高工厂自动化水平具有较大的现实意义。
2、OMRONPLC网络欧姆龙plc的网络分为三层:Ethernet网、ControllerLink 控制器网、CompoBUS/D与CompoBUS/S元器件网,其三层网络控制平台如图1所示。
图1OMRONPLC三层网络2.1Ethernet网Ethernet网络即所说的以太网,它是工厂自动化领域用于信息管理层上的网络,它的通信速率高,可达100Mbps,以太网模块使PLC可以作为工厂局域网的一个节点,网络上的任何一台计算机都可以实现对它的控制。
在OMRON的PLC中,中型机以上的PLC才能上以太网,通常有三种机型,CS1系列、CV系列、和C200H系列。
在CS1系列和CV系列上分别直接装Ethernet单元CS1W-ETN01/11、CV500-ETN01,而在C200Hα上除了必须安装PC卡单元(C200HW-PCS01)外,还必须配置通信板(C200HW-COM01/04),并用总线单元将PC卡单元与通信板连接起来。
OMRONPLC的Ethernet网具有以下功能:远程编程和监控:在连接到Ethernet网络的计算机上运行CX-Programmer可以对所有连接的Ethernet网络上的PLC进行编程和监控。
FINS信息服务:在PLC之间和PLC与计算机之间发送FINS信息,使用EthernetFinsGateway能够不必编写FINS指令程序而直接管理信息。
Socket服务:由Windows提供一组函数,允许用户程序直接调用及使用TCP和UDP协议,在Ethernet网上进行数据传输。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB与PLC通信程序(欧姆龙PLC)
分类:| 转自:原文地址被1人转藏+放进我的宝盒2010-9-2 21:45:46
VB与PLC通信程序(欧姆龙PLC)
关于VB的MSCOMM控件可参考相关资料。
通信程序摘要如下:
(1)初始化程序
mport=2 ’选择COM2
Mscomm1.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 string
Dim Answerlen as integer
node=”03”’节点号
Command=”RR”’命令为读IR区
begin=”0000”’从IR000开始
number=10 ’读取长度
Answerlen=51 ’计算接收字符串长度
进行命令发送和接收应答处理:
Dim FCS, I as integer
Dim s ,f as string
s=”@”+node+Commad+begin+number
FCS=0
For i=1 to Len(s)
FCS=FCS xor Asc(Mid$(s,i,1) ) ’帧校验码FCS
Next i
f=Hex$(FCS)
If Len(f)=1 Then f=”0”+f
Commfrm.MSComm1.Output=s + f + ”*”+ CHR$(13) ’命令帧发送
Do
Dummy=DoEvents()
Loop Untill Commfrm.MSComm1.InbufferCount >= Answerlen ’等待应答帧
Do tag1= Commfrm.MSComm1.Input
Loop Untill Commfrm.MSComm1.InbufferCount=0 ’读完应答帧
上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。