WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
1 VBA简介WWW_P※LCJS_COM-PLC-)技.术_网
Visual Basic的应用程序版(VBA)是Microsoft公司长期追求的目标,使可编程应用软件得到完美的实现,它作为一种通用的宏语言可被所有的Microsoft 可编程应用软件所共享。在没有VBA以前,一些应用软件如Excel、Word、Access、Project等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。拥有一种可跨越多个应用软件,使各应用软件产品具有高效、灵活且一致性的开发工具是至关重要的。VBA作为一种新一代的标准宏语言,具有上述跨越多种应用软件并且具有控制应用软件对象的能力,使得程序设计人员仅需学习一种统一的标准宏语言,就可以转换到特定的应用软件上去,程序设计人员在编程和调试代码时所看到的是相同的用户界面,而且VBA与原应用软件的宏语言相兼容,以保障用户在代码和工作上的投资。有了VBA以后,多种应用程序共用一种宏语言,节省了程序人员的学习时间,提高了不同应用软件间的相互开发和调用能力。WWW_PL※CJS_COM-PLC-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
2 串口通讯程序WWW_P※LCJS_COM-PLC-)技.术_网
简单的串口通讯程序一般是先由上位机向下位机发送读(write)或写(read)数据命令,然后等待下位机应答;下位机接受到命令之后,首先要对数据命令进行校验,对于符合校验约束的命令下位机会将相应的数据回复到上位机,对于不符合校验约束的命令下位机或将其抛弃或回复错误信息;上位机接收到下位机的响应之后,首先要对接收到的回复信息进行校验,对不符合校验约束的数据进行异常处理,对符合校验约束的信息进行解码,解码之后的信息便是上位机从下位机获得的有效信息了。WWW_PL※CJS_COM-PLC-技.术_网
上位机向串口发送读命令之后需要等待下位机应答并读取回复信息,常用的等待有3种方式:WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
1) 轮询式WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
上位机向串口发送读命令之后一直等待下位机应答,通讯程序处于一个等待循环中。WWW_PLCJS@_COM%-PLC-技.术_网
优点:速度快、误码率低(几乎不存在误码)。WWW_PLCJS@_COM%-PLC-技.术_网
缺点:消耗CPU。(解决办法:使用Sleep()API函数)。WW.W_PLC※JS_C,OM-PL,C-技.术_网
2) 消息式P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
消息式通讯是采用响应WINDOWS消息的办法读取串口。WWW_PLCJS@_COM%-PLC-技.术_网
优点:节省CPU、误码率低。P.L.C.技.术.网——可编程控制器技术门户
缺点:发送接收机制过于繁琐。WWW.PLCJS.COM——可编程控制器技术门户
3) 定时接收式W1WW_P4LCJS_COM-PLC-技.术_网
定时接收式通讯是根据预设的定时器时间进行读取数据。——可——编——程——控-制-器-技——术——门——户
优点:发送接收机制相对简单、节省CPU。W1WW_P4LCJS_COM-PLC-技.术_网
缺点:误码率太高,不同的硬件需要配置不同的通讯时间参数,需要严格的校验运算。WWW.PLCJS.COM——可编程控制器技术门户
WW.W_PLC※JS_C,OM-PL,C-技.术_网
3 EXCEL-VBA串口通讯实例WWW_P※LCJS_CO※M-PLC-技-.术_网
软件:EXCEL。WWW_PLCJS@_COM%-PLC-技.术_网
硬件:艾默生EC10 PLC。W1WW_P4LCJS_COM-PLC-技.术_网
功能:通过EXCEL中的按钮控制PLC的输出继电器Y0。WWW_PL※CJS_COM-PLC-技.术_网
界面:RUN(运行通讯)、STOP(停止通讯)、Y0(Y0 ON/OFF控制)。 WWW_PLCJS_COM-PLC-技.术_网
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
plcjs.技.术_网
WWW_PLCJS@_COM%-PLC-技.术_网
主程序:P.L.C.技.术.网——可编程控制器技术门户
Option Explicit——可——编——程——控-制-器-技——术——门——户
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongWW.W_PLCJS_COM-PLC-技.术_网
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As LongWWW_PLC※JS_COM-PmLC-技.术_网
Public com1 As New MSCommLib.MSCommWWW_P※LCJS_COM-PLC-)技.术_网
Public y0Stt As BooleanP_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
Public y0_on As BooleanP_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
Public tmrFlag As BooleanWW.W_PLCJS_COM-PLC-技.术_网
Public tmr As LongWWcW_PLCJS_COM-PLC-技.术_网
Sub runn()WWW_PLC※JS_COM-PmLC-技.术_网
On Error GoTo edWWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
com1.Settings = "9600,e,8,1"WWW.PLCJS.COM——可编程控制器技术门户
If com1.PortOpen = False ThenWWW_PLCJS@_COM%-PLC-技.术_网
com1.PortOpen = TrueWWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
End IfWW.W_PLC※JS_C,OM-PL,C-技.术_网
tmr = SetTimer(0, 0, 500, AddressOf ontimer)WWW.PLCJS.COM——可编程控制器技术门户
Exit SubP.L.C.技.术.网——可编程控制器技术门户
ed:WWW_P※LCJS_COM-PLC-)技.术_网
MsgBox "串口打开错误!"WWW_P※LCJS_CO※M-PLC-技-.术_网
End SubWWW_P※LCJS_CO※M-PLC-技-.术_网
Sub stopp()WWW_PLCJS_COM-PLC-技.术_网
If com1.PortOpen = True ThenWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
com1.PortOpen = FalseWWW_PLCJS@_COM%-PLC-技.术_网
KillTimer 0, tmrWWcW_PLCJS_COM-PLC-技.术_网
End IfWWW_P※LCJS_COM-PLC-)技.术_网
End Sub——可——编——程——控-制-器-技——术——门——户
Public Function ontimer() WWW_PL※CJS_COM-PLC-技.术_网
Dim a(7) As ByteWWW_PL※CJS_COM-PLC-技.术_网
Dim add As LongWWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
On Error GoTo edWWW_P※LCJS_CO※M-PLC-技-.术_网
If tmrFlag = False ThenWWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
tmrFlag = TrueWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
If y0_on = True Then——可——编——程——控-制-器-技——术——门——户
y0_on = FalseWWcW_PLCJS_COM-PLC-技.术_网
If y0Stt = True ThenWW.W_PLC※JS_C,OM-PL,C-技.术_网
a(0) = &H1 P.L.C.技.术.网——可编程控制器技术门户
a(1) = &H5 WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
a(2) = &H0 WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
a(3) = &H0 plcjs.技.术_网
a(4) = &HFF WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
a(5) = &H0 WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
a(6) = &H8C P.L.C.技.术.网——可编程控制器技术门户
a(7) = &H3A WWW.PLCJS.COM——可编程控制器技术门户
com1.Output = a WWW_P※LCJS_COM-PLC-)技.术_网
add = 0WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
DoWWW_P※LCJS_COM-PLC-)技.术_网
DoEventsWWW_PLC※JS_COM-PmLC-技.术_网
Sleep 10WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
add = add 1WW.W_PLC※JS_C,OM-PL,C-技.术_网
If add >= 100 ThenWW.W_PLCJS_COM-PLC-技.术_网
Exit DoWWW_P※LCJS_CO※M-PLC-技-.术_网
End IfWWcW_PLCJS_COM-PLC-技.术_网
Loop Until com1.InBufferCount >= 8 WWW_P※LCJS_CO※M-PLC-技-.术_网
ElseW1WW_P4LCJS_COM-PLC-技.术_网
a(0) = &H1 WWW_P※LCJS_COM-PLC-)技.术_网
a(1) = &H5 plcjs.技.术_网
a(2) = &H0 WWW_P※LCJS_COM-PLC-)技.术_网
a(3) = &H0 WWW_P※LCJS_CO※M-PLC-技-.术_网
a(4) = &H0 WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
a(5) = &H0 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
a(6) = &HCD P.L.C.技.术.网——可编程控制器技术门户
a(7) = &HCA WWcW_PLCJS_COM-PLC-技.术_网
com1.Output = a WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
add = 0WWW_PLC※JS_COM-PmLC-技.术_网
DoWWW.PLCJS.COM——可编程控制器技术门户
DoEventsplcjs.技.术_网
Sleep 10WWW_PLC※JS_COM-PmLC-技.术_网
add = add 1WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
If add >= 100 ThenWWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
Exit DoWWW_PLC※JS_COM-PmLC-技.术_网
End Ifplcjs.技.术_网
Loop Until com1.InBufferCount >= 8WW.W_PLC※JS_C,OM-PL,C-技.术_网
End IfWWW_PLCJS_COM-PLC-技.术_网
End IfWWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
End IfWWW.PLCJS.COM——可编程控制器技术门户
tmrFlag = FalseWW.W_PLCJS_COM-PLC-技.术_网
Exit FunctionWWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
ed: MsgBox "串口错误!"WW.W_PLCJS_COM-PLC-技.术_网