VBA 与PLC通讯.doc

上传人:飞****9 文档编号:136387043 上传时间:2020-06-28 格式:DOC 页数:6 大小:146KB
返回 下载 相关 举报
VBA 与PLC通讯.doc_第1页
第1页 / 共6页
VBA 与PLC通讯.doc_第2页
第2页 / 共6页
VBA 与PLC通讯.doc_第3页
第3页 / 共6页
VBA 与PLC通讯.doc_第4页
第4页 / 共6页
VBA 与PLC通讯.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《VBA 与PLC通讯.doc》由会员分享,可在线阅读,更多相关《VBA 与PLC通讯.doc(6页珍藏版)》请在金锄头文库上搜索。

1、 1 VBA简介Visual Basic的应用程序版(VBA)是Microsoft公司长期追求的目标,使可编程应用软件得到完美的实现,它作为一种通用的宏语言可被所有的Microsoft 可编程应用软件所共享。在没有VBA以前,一些应用软件如Excel、Word、Access、Project等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门往学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。拥有一种可跨越多个应用软件,使各应用软件产品具有高效、灵活且一致性的开发工具是至关重要的。VBA作为一种新一代的标准宏语言,具有上述跨越多种应用软件并且具有控制应用软件对象的能力

2、,使得程序设计职员仅需学习一种同一的标准宏语言,就可以转换到特定的应用软件上往,程序设计职员在编程和调试代码时所看到的是相同的用户界面,而且VBA与原应用软件的宏语言相兼容,以保障用户在代码和工作上的投资。有了VBA以后,多种应用程序共用一种宏语言,节省了程序职员的学习时间,进步了不同应用软件间的相互开发和调用能力。 2 串口通讯程序简单的串口通讯程序一般是先由上位机向下位机发送读(write)或写(read)数据命令,然后等待下位机应答;下位机接受到命令之后,首先要对数据命令进行校验,对于符合校验约束的命令下位机会将相应的数据回复到上位机,对于不符合校验约束的命令下位机或将其抛弃或回复错误信

3、息;上位机接收到下位机的响应之后,首先要对接收到的回复信息进行校验,对不符合校验约束的数据进行异常处理,对符合校验约束的信息进行解码,解码之后的信息便是上位机从下位机获得的有效信息了。上位机向串口发送读命令之后需要等待下位机应答并读取回复信息,常用的等待有3种方式:1) 轮询式上位机向串口发送读命令之后一直等待下位机应答,通讯程序处于一个等待循环中。优点:速度快、误码率低(几乎不存在误码)。缺点:消耗CPU。(解决办法:使用Sleep()API函数)。2) 消息式消息式通讯是采用响应WINDOWS消息的办法读取串口。优点:节省CPU、误码率低。缺点:发送接收机制过于繁琐。3) 定时接收式定时接

4、收式通讯是根据预设的定时器时间进行读取数据。优点:发送接收机制相对简单、节省CPU。缺点:误码率太高,不同的硬件需要配置不同的通讯时间参数,需要严格的校验运算。 3 EXCEL-VBA串口通讯实例软件:EXCEL。硬件:艾默生EC10 PLC。功能:通过EXCEL中的按钮控制PLC的输出继电器Y0。界面:RUN(运行通讯)、STOP(停止通讯)、Y0(Y0 ON/OFF控制)。 主程序:Option ExplicitPublic Declare Sub Sleep Lib kernel32 (ByVal dwMilliseconds As Long)Public Declare Functio

5、n SetTimer Lib user32 (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib user32 (ByVal hwnd As Long, ByVal nIDEvent As Long) As LongPublic com1 As New MSCommLib.MSCommPublic y0Stt As BooleanPublic y0_on As Boole

6、anPublic tmrFlag As BooleanPublic tmr As LongSub runn()On Error GoTo edcom1.Settings = 9600,e,8,1If com1.PortOpen = False Thencom1.PortOpen = TrueEnd Iftmr = SetTimer(0, 0, 500, AddressOf ontimer)Exit Subed:MsgBox 串口打开错误!End SubSub stopp()If com1.PortOpen = True Thencom1.PortOpen = FalseKillTimer 0,

7、 tmrEnd IfEnd SubPublic Function ontimer()Dim a(7) As ByteDim add As LongOn Error GoTo edIf tmrFlag = False ThentmrFlag = TrueIf y0_on = True Theny0_on = FalseIf y0Stt = True Thena(0) = &H1 a(1) = &H5 a(2) = &H0 a(3) = &H0 a(4) = &HFF a(5) = &H0 a(6) = &H8C a(7) = &H3A com1.Output = a add = 0DoDoEve

8、ntsSleep 10add = add + 1If add = 100 ThenExit DoEnd IfLoop Until com1.InBufferCount = 8 Elsea(0) = &H1 a(1) = &H5 a(2) = &H0 a(3) = &H0 a(4) = &H0 a(5) = &H0 a(6) = &HCD a(7) = &HCA com1.Output = a add = 0DoDoEventsSleep 10add = add + 1If add = 100 ThenExit DoEnd IfLoop Until com1.InBufferCount = 8E

9、nd IfEnd IfEnd IftmrFlag = FalseExit Functioned: MsgBox 串口错误!tmrFlag = FalseEnd Function 界面程序:Private Sub cmd1_Click()y0_on = Truey0Stt = Not y0SttEnd SubPrivate Sub cmdRun_Click()runnCheckBox1.Value = 1End SubPrivate Sub cmdStop_Click()stoppCheckBox1.Value = 0End Sub 4 结束语由上可见,VBA已经广泛应用于微软的应用软件当中,所

10、以为更好的完善二次开发功能,众多的组态软件都在VBA支持上做了努力,世纪星组态软件开发语言已与VBA非常相似,相信在未来的版本中,世纪星将全面支持VBA,它的二次开发功能会迈上一个新的台阶。可编程序控制器(PLC)都有一个编程口。以日本三菱公司生产的PLC为例(包括FX系列和A系列),其编程口为RS-422格式,根据PLC型号不同又分为8针座编程口和25针座编程口。对于后者,可直接将SC08编程电缆将PLC的编程口和微型计算机的RS232口连接起来;对于后者,则还需要一根转换电缆将PLC 的8针座编程口和25针编程电缆相连。无论何种情况,一旦将PLC用户程序由微型计算机编程环境传到PLC 用户

11、程序区,其编程口大多就没有被再利用。其实,这是一种浪费。也就是说,可利用此编程口实现微型计算机和PLC 的数据通讯,将PLC的工作状态纳入微型计算机管理之下。二、编程口操作命令类型与通讯端口初始化串行通讯是计算机与其它机器之间进行通讯的一种常用方法,在WINDOWS操作系统中提供了实现各种串行通讯的API函数。通过SC08编程电缆或FX232AW模块,可将微型计算机的串行通讯口RS232和PLC 的编程口连接起来,这样微型计算机就可对PLC的RAM区数据进行读、写操作。由PLC本身所具有的特性,可对PLC进行以下四种类型的操作:(1)位元件或字元件状态读操作(CMD0);(2)位元件或字元件状

12、态写操作(CMD1);(3)位元件强制ON操作(CMD7);(4)位元件强制OFF操作(CMD8)。另外,在进行上述四类操作以前,首先要对端口进行初始化操作,即设定通讯协议(包括设置通讯波特率、数据位数、数据停止位及奇偶校验)。在WINDOWS的SDK中定义了一个结构DCB,该结构详细地说明了如何对通讯端口进行控制,所以通讯端口的初始化也是围绕着对这个结构的正确设置为中心进行的。用VC语言实现端口初始化如下:BOOL CSerial:Open(int nPort)/nPort 为微型计算机串行通讯口端口号。nport=1为端口1;nPort=2为端口2。char szPort15;DCB do

13、b;m_hIDComDev=CreateFile(szPort, GENERIC_READGENERIC_WRITE,O,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMALFILE_FLAG_OVERLAPPED,NULL);dcb.DCB1ength=sizeof(DCB);GetCommState(m_hIDComDev,&dcb);/取得通讯资源当前设置dcb.BaudRate=9600;/设定波特率为9600dcb.ByteSize=7;/7数据位dcb.Parity=2;/偶校验dcb.StopBits=0;/设定1个停止位if(SetCommState(m_hIDComDev,&dcb)return(TRUE);else return(FALSE);/设置端口,若设置成功则返回TRUE,否则返回FALSE需要说明的是CSerial是一个用于串行通讯的类,它包含了进行串行通讯的所需的函数。除上述端口初始化成员函数Open外,还包括另两个重要成员函数:一个是endData,把数据从一个缓冲区发送到串行端口。另一个是ReadData,从端口的接收缓冲区中读入数据。其次,在每进行一次上述四类操

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号