作 者:台湾南台科技大学 电机系 宓哲民
1 概论
在plc的图形监控技术中,虽然以使用通用型的人机接口搭配套装式图形监控软件较为简易、便利,但是就学习或使用者本身而言,只是就图形监控组件的变量(编号)或属性作一些简单的设定,至于plc pc间如何透过rs-232或rs-485串行通讯端口执行接点状态或数据缓存器数值之读取、写入与控制等,就有些雾里看花了。此外条形码扫瞄器(bar code reader,bcr)、电子磅秤(electronic load cell)、温度控制器、modus通讯、区域或网络通讯…等,若不知道相关的通讯协议,就无法与pc或plc联机以读取或写入所需的数据。有鉴于plc在产业自动化中的枢纽地位,加以各技职院校均开设有plc及vb等相关课程,若使用vb 作为plc的图形监控,在教学、自学及实作上不但可坐收事半功倍之效,同时也可达到科技整合的目标,提升机电控制的技术层次,因此本专栏就以plc_vb图形监控作为探讨主题。
图1 通讯协议数据格式
图2 位元元件位址的计算方式
2 plc通讯协议
pc plc通讯之目的,不外乎是pc与plc间进行相关接点状态或数据缓存器数值之读取、写入或控制,上述数据存取或控制,除了在硬件联机及通讯参数设定方面必须双方一致外,在讯息格式方面亦必须符合专属的通讯协议。在pc与plc的通讯架构中,pc为主系统(master),plc则为仆系统(slave),亦即pc与plc间通讯,是由pc发出命令讯息给plc,只有在plc接收到pc的命令后,才会响应一讯息给pc。
以下以丰炜(vigor)plc为例,介绍其m、vb、vh系列plc之通讯协议:
2.1 传输讯息格式
为了使得各类型pc能够互通讯息,美国国家标准局制定了ascii码。ascii码原先仅使用7bits,因考虑到一些特殊的图形码,故目前已扩充为8bits。不过在plc pc通讯上,ascii码还是采用原先7bits的编码方式,所以其数据位为7bits。
2.2 通讯参数
(1)传输格式:usb或标准rs-232、异步(asynchronous)、双向传输。
(2)传输速率或鲍率(baud):plc内建之cp1固定为19200bps;cp2有4800、9600、19200、及38400bps等可供选择,由ladder master设定;至于 cp3则固定为19200bps。
(3)同位检查(parity check):偶同位(even parity,e)。
(4)数据位(data bits):7 bits。
(5)停止位(stop bit):1 bit。
2.3 通讯协议数据格式
通讯协议数据格式如下图1所示:
(1)起始码
数据传输的开头字符,pc下达命令给plc时之起始码为stx(2h),plc回传资料给时为ack(6h)。
(2)站号
数据传输对象的辨识码,在通讯回路中每一台plc都必须有一个站号,当pc对plc下达命令时,就是以站号来指定要将命令下达给那一台plc。plc内建之cp1固定为0号;cp2可选择范围为0~255号,由ladder master设定;cp3由vb-cadp模块左侧旋转开关设定,范围为0~99号。
(3)命令
通讯命令系pc要求plc所执行之动作,可以经由pc对plc执行位组件之状态或缓存器的值连续读取、写入或位组件on/off等命令共有4种,各命令码代号、种类、对象组件及其功能,如表1所示。
(4)传送数据
数据传输的内容,包含:数据地址、长度、内容及错误码…等。
(5) 结束码
数据传输的结束字符为etx(3h),当plc收到代表通讯结束的etx字符后,即可开始处理该次通讯命令或数据。
(6)检查码
系将图1中之站号~结束码中各字段所有ascii字符之16进制数值依序相加,但不考虑进位,也就是取其和最右边的2个数值作为检查码,此一核算方式称为2纵式余数查核法2(longitudinal redundancy check,lrc)。当接收端收到命令讯息后会依相同计算法则重新核算其检查码,若两者数值相同,则表示所传输数据正确,否则表示在传输过程中有错误发生。
(7)错误码
在plc的回传数据中会有一个错误的讯息码,错误码及其说明如表2所示。
2.4 数据地址
pc plc通讯必须了解plc内部有那些组件,以及那些组件的实际地址(address),以便于进行数据的存取。
(1)群组地址
适用于连续数据读取【51h】及连续数据写入【61h】等通讯命令,可分为下列二种:
① 位型态组件
诸如:x、y、m、s、t、c等多个字节(bytes)数据。若字节数byte=1时,则群组地址定义8个连续的位型态组件。
② 字符组型态组件
诸如:t/c现在值或缓存器d之数值等。
常用群组地址如表3所示,t/c现在值或d数值占有2个连续的地址。
(2)位组件地址
适用于将指定的bit设定为on【70】及设定为off【71】等通讯命令。位组件地址=数据地址+组件位置,计算方式说明如下:
【例1】求位组件y10的地址
解答:10/8=商数=1…余数=2;y0群组之数据地址=0040,取前3位=004+商数+余数=00412。之后将00412的前三个位舍弃,即可求得y10组件地址为020a,详细步骤如图2所示。经上述计算程序转换后之常用位组件地址如表4所示:
图4 检查码计算_vb窗体
图5 检查码计算结果
图6 位组件on/off_vb窗体
表1 pc→plc通讯命令
表2 错误码及其说明
表3 常用群组地址
表4 经过转换后之常用位元元件位址
3 vb简介
visual basic(vb)由于它提供了完善的图形化接口,兼具对象导向、事件驱动的程序设计理念,让使用者在vb的整合开发环境(ide)下,点选工具箱中所提供的识别图式工具按钮,经由对象在窗体的适当配置,不用编写程序即可完成所须的输入/输出接口,并可立即在屏幕上看到画面设计的实际结果,诸如:对象大小、位置、标题、颜色、图形…等。此外vb方便且强大的除错功能,更大大地提升了程序设计的效能,因此在 windows多任务作业环境下,具亲和力且易学易用的vb,无疑是初学者开发应用程序的最佳选择。
在plc的图形监控技术中,虽然以使用套装式图形监控软件较为简易、便利,但是就学习过程或使用者本身而言,并无法提升自己的技术层次。有鉴于plc在产业自动化中的枢纽地位,并考虑plc_pc通讯和vb建构输入/输出接口的便利及自行开发应用程序的重要性与日俱增,加上vb新增的进阶功能,诸如:多媒体、对象连结与内嵌(ole)、动态链接库(dll)、动态数据交换(dde)…,若搭配其它数据库软件包(excel、access、dbase、foxpro…),以及因特网支持(active x…),则vb在plc图形监控中将更形简易和便利。
microsoft不断的推陈出新,将vb 6.0先后加以更新为vb.net、vb 2005及2008,虽然增加了许多因特网的应用功能,但其硬件规格及需求不但较vb 6为高,而且作业环境及工作窗口亦较vb 6来得复杂,无形中拉高了学习的门坎,使初学者不禁望而却步。一些简单的机电控制或应用,并非一定得使用vb 2005或2008不可,vb 6依然受到大多数人的关爱。有鉴于此,本文仍然以vb 6为主,相信具备了程序设计的理念和经验之后,跨入vb 2005或2008的学习及应用领域,应该可以触类旁通。
图7 mscomm控件通讯参数设定
图8 y0设定为on的通讯格式
图9组件群组连续写入及读取_vb窗体
图10连续写入_y0~y7全亮 4 vb通讯对象_mscomm
在vb6的专业版及企业版中,mscomm控件并不是预设之常用工具,但是可以经由新增工具的方式来开启mscomm控件,使应用程序具有串行通讯的功能。启动vb之后执行菜单列中『项目』『设定使用组件』,出现一[设定使用组件]对话框,在控件中勾选microsoft comm control 6.0,按下『确定』钮后,即可将mscomm控件加载一般工具箱内,使其成为预设的工具选项,mscomm控件的识别图标为一电话盒,如图3所示。
mscomm控件在pc和plc串行通讯中较常使用的属性如下:
(1)mscomm1.output = commandcode
将commandcode(命令码)写入传送暂存区,亦即pc经由通讯端口送出命令字符串给plc。
(2)mscomm1.input
传回接收暂存区中之数据,亦即pc经由通讯端口接收plc传回来的响应字符串讯息。
(3)mscomm1.portopen = false
关闭通讯端口。
(4)mscomm1.portopen = true
开启通讯端口。
图11连续读取_y0~y7全亮
图12 1个byte数据读取示意图
图13连续写入_y0~y17全亮
图14连续读取_y0~y17全亮
5 plc_vb基本通讯命令学习范例
5.1【例1】检查码计算
(1)设计一vb窗体如图4所示,并分别在窗体中设置如图所示的对象(或控件)。为了帮助读者理解程序代码,我们在相关的对象上方以卷标(label)项作了一些批注。
(2)若要将位组件m10(组件地址:040a)设定为on(命令:70),且采plc内建之cp1(站号:0),则程序执行后在text1文字方块内输入0070040a,之后按下检查码计算钮,检查码计算结果为9f,如图5中之text2所示。
(3)程序代码
为了缩短篇幅,我们直接在程序代码中加上批注,亦即单引号`或rem,它属于不被执行叙述,其目的在于增加程序的可读性或便于日后修改。
private sub command1_click()
`变量宣告:integer为整数、string为字符串
dim n, sum as integer
dim checkstring as string
`通讯格式中的英文字符必须为大写(a~f),故先行将text1.text所输入之传送数据,经由程序自动转换为大写字母,然后加上结束码etx:chr(3),形成一字符串checkstring
checkstring = ucase(text1.text + chr(3))
` for--next属于重复结构中之计数循环,指令pc在一定的次数内,重复的执行某一叙述区段,亦即取出checkstring字符串中每一个字符,并累加每一个字符的ascii码,而得出一整数sum。
for n = 1 to len(checkstring)
sum=sum + asc(mid(checkstring, n, 1))
next n
`将10进制整数sum转换为十六进制,并取其右边二位数,即为所求检查码。
text2.text = right(hex(sum), 2)
end sub
private sub command2_click()
`将text1及text2等控件内容予以清除成为空白字符串
text1.text = “” : text2.text = “”
`设定text1控件为驻点对象,亦即使text1取得窗体控制权
text1.setfocus
end sub
private sub command3_click()
end
end sub
5.2【例2】基本通讯命令_位组件on/off【70、71】
(1)设计一vb窗体如图6所示,并分别设置如图所示的对象或控件。
(2)将鼠标移到电话盒图标上,按一下鼠标右键,在下拉式快捷菜单中分别设定正确的:a、通讯连接端口,b、通讯参数,c、交握协议,如图7所示。
(3)若要将位组件y0设定为on,并采plc内建之cp1(站号固定为0号),程序执行后分别在各text文字方块内键入如图8所示的通讯格式,之后按下on/off钮,此时主机led面板上之y0灯号亮起。将y0设定为off时,只要将命令改为71、检查码改为8d,再度按下on/off钮后,则led面板上之y0灯号熄灭。
(4)程序代码
private sub command1_click()
`开启通讯端口
mscomm1.portopen = true
` pc下达位组件on/off命令给plc
mscomm1.output = chr(2) & text4.text & text1.text & text2.text & chr(3) & text3.text
`关闭通讯端口
mscomm1.portopen = false
end sub
private sub command2_click()
text1.text = "": text2.text = "": text3.text = "": text4.text = ""
text1.setfocus
end sub
private sub command3_click()
end
end sub
5.3【例3】基本通讯命令_组件群组连续写入【61】及读取【51】
(1)如前所述,组件群组定义为8×n个连续的位型态或字符组组件。设计一vb窗体如图9所示,并分别设置如图所示的对象或控件。
(2)若要将字节组件y0~y7全部设定为on,并采plc内建之cp1,程序执行后分别在各text文字方块内键入如图10所示的通讯格式,之后按下write钮,此时主机led面板上之y0~y7灯号亮起。若键入如图11所示的通讯格式,按下read钮,则经由plc读取的数据亦为ff。
(3)程序代码
private sub command1_click()
mscomm1.portopen = true
` pc下达连续写入命令给plc
mscomm1.output = chr(2) & text6.text & text1.text & text2.text & text3.text & text4.text & chr(3) & text5.text
mscomm1.portopen = false
end sub
private sub command4_click()
dim strtmp as string
mscomm1.portopen = true
` pc下达连续读取命令给plc
mscomm1.output = chr(2) & text6.text & text1.text & text2.text & text3.text & chr(3) & text5.text
`后测试循环,等待plc响应字符串
do
strtmp = strtmp & mscomm1.input
loop until len(strtmp) >= 12
`取出数据
text7.text = mid(strtmp, 8, 2)
mscomm1.portopen = false
end sub
(4)1个byte数据读取程序代码解说
1个byte数据读取,plc响应字符串的字符数为12,数据由响应字符串的第8个字符开始往后取2个字符即为所求,如图12所示。
(5)本程序可扩充为字符组(word)连续写入及读取,以1个字符组为例,因为1word=2 bytes,故y0~y17全亮时之连续写入通讯格式如图13所示,连续读取通讯格式则如图14所示。
(6)1个word数据读取程序代码解说
1个word数据读取,plc响应字符串的字符数为14,数据由响应字符串的第8个字符开始往后取4个字符。因为数据是由较低次位lsb开始传输,故将low byte(b7~b0)和high byte(b15~b8)对调即为所求,因此祇要修改下列程序代码即可执行1个word数据读取,示意图如图15所示。
do
strtmp = strtmp & mscomm1.input
loop until len(strtmp) >= 14
response = mid(strtmp, 8, 4)
text7.text = right(response, 2) & left(response, 2) 6 plc_vb进阶学习范例
【例4】马达起动停止控制
综合运用基本通讯命令,利用单一组件mn之on及off,来仿真一plc外部输入按钮。并启动定时器(timer)控件每隔一特定的时间持续不断的经由串行通讯端口去侦测plc是否已将响应讯息传送到接收暂存区,并将其内容值执行and运算,以取出所拟监看接点。在接点状态on/off变化时,则更改形状(shape)控件背景颜色(backcolor)的属性,达到图形监控的目的。
(1)plc程序设计
马达起动停止控制阶梯图,如图16所示。
(2)vb窗体
设计一马达起动停止控制之vb窗体如图17所示,并分别设置如图所示的对象或控件;vb执行结果则如图18所示。
(3)程序代码
private sub form_load()
`启动定时器
timer1.enabled = true
end sub
private sub command1_click()
`m0_on
mscomm1.portopen = true
mscomm1.output = chr(2) & "00" & "70" & "0400" & chr(3) & "8e"
mscomm1.portopen = false
`m0_off
mscomm1.portopen = true
mscomm1.output = chr(2) & "00" & "71" & "0400" & chr(3) & "8f"
mscomm1.portopen = false
end sub
private sub command2_click()
` m1_on
mscomm1.portopen = true
mscomm1.output = chr(2) & "00" & "70" & "0401" & chr(3) & "8f"
mscomm1.portopen = false
`m1_off
mscomm1.portopen = true
mscomm1.output = chr(2) & "00" & "71" & "0401" & chr(3) & "90"
mscomm1.portopen = false
end sub
private sub timer1_timer()
dim strtmp as string
dim inttmp as integer
mscomm1.portopen = true
` pc下达连续读取y0~y7命令给plc
mscomm1.output = chr(2) & "00" & "51" & "0040" & "01" & chr(3) & "ee"
do
strtmp = strtmp + mscomm1.input
loop until len(strtmp) >= 12
strtmp = mid$(strtmp, 8, 2)
`将plc响应数据转换成10进制数值,并与1(y0为b0)作and运算,以取出y0
a = val("&h" + strtmp) and 1
`判断y0的值
select case a
case 1 ` 1表示y0 on
shape1.backcolor = vbred`淡红色
label4.caption = "启动"
case 0 ` 0表示y0 off
shape1.backcolor = vbgreen `淡绿色
label4.caption = "停止"
end select
mscomm1.portopen = false
end sub
图15 1个word数据读取示意图
图16马达起动停止控制阶梯图
图17 马达起动停止控制_vb窗体
图18 马达起动停止控制执行结果 7 结论
在plc的图形监控技术中,虽然以使用通用型的人机接口搭配套装式图形监控软件较为简易、便利,但是就学习或使用者本身而言,并不知晓pc plc间如何透过串行通讯端口执行接点状态或数据缓存器数值之读取、写入与控制等。此外更新版的vb虽然增加了许多因特网的应用功能,但作业环境及工作窗口亦变得较为复杂,使初学者不禁望而却步。一些简单的机电控制或应用,使用vb 6依然游刃有余。相信具备了vb6程序设计的理念和经验之后,跨入vb 2005或2008的学习及应用领域,应该可以触类旁通。
本文以丰炜plc通讯协议为例,就数据传输时之检查码计算、位组件on/off及组件群组连续写入及读取等基本通讯命令,使用vb6并按部就班为读者作一解说,最后综合运用上述基本通讯命令,以马达起动停止控制为例,使用定时器每隔一特定的时间,持续不断的经由串行通讯端口执行数据或数值的连续读取,并在接点状态on/off变化时,更改形状控件的背景颜色,达到plc_vb图形监控的目的。
通讯协议一般而言实属大同小异,故文中所提及之指令解说与实作,其它厂牌或机种之plc亦可适用。俗云:“师傅领进门,修行在个人”,6次专栏在此暂时告一段落,但愿您能针对每月专栏主题用心体会、勤加练习,相信假以时日您亦可“青出于蓝,而更胜于蓝”。 作者简介
宓哲民 男 硕士,副教授,主要研究方向为plc、人机接口及图形监控。
颜见明 男 现任丰彰国际贸易(上海)有限公司总经理。 参考数据
[1] 宓哲民,劉春山,戴源良,等.vb图形监控_f(a)x系列plc(修订三版)[m].台湾:文京书局,2010.
[2] 王义文,宓哲民,陈文轩,陈文耀,等.可编程控制器(plc)原理与应用实务.北京:科学出版社,2010.
[3] "m、vb、vh系列plc程序编辑手册".丰炜科技企业有限公司.2010年.
|