1 引言
plcjs.技.术_网
可编程序逻辑控制器(PLC)是一台工业控制用微型计算机系统,用以代替传统的继电器控制系统,可靠性高,通用性强,大大减少故障的发生。80年代以来,PLC已经成为电控技术发展趋势,广泛应用于电子、机械、轻工、发电冶金、矿山、石油等工业。在实际工作中,我们要常常解决的问题便是如何实现PLC与个人微机之间的通讯,从而方便有效的通过RLL(PLC梯形图)编程,实现PID控制,BCD输出,或者PWM输出,进行闭环反馈控制。P.L.C.技.术.网——可编程控制器技术门户
2 PLC通讯原理WWW_P※LCJS_CO※M-PLC-技-.术_网
笔者采用美国IPM公司的IP1612-220PLC,有28个点:16个输入点,和12个输出点,负载能力高达8A,有32个定时器和32个计数器,256个内部继电器和56个数据寄存器,采用VLSI超大规模集成电路最新技术和EEPROM存储器,随机提供IP-EPS软件包。它允许通过外接RS232串行接口对定时器,计数器和内部继电器进行实时读和写访问,除了个人计算机和用来把RLL控制程序输入PLC外,不再需要任何设备。为从PLC中读出一字节数据,只要给它发送变量的代码(地址),PLC就读出该变量的值作为响应,为读出一个双字节数值,使用增加的特殊代码0XE6读两次,其原理分别如图1所示。
WWW.PLCJS.COM——可编程控制器技术门户
P.L.C.技.术.网——可编程控制器技术门户
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
图1 PLC和计算机的通讯原理示意图plcjs.技.术_网
WW.W_PLC※JS_C,OM-PL,C-技.术_网
如果为写入一个字节到IP1612-220,首先要读出它,然后发送给PLC特殊代码0XFF,跟着送你想写给该变量的新数值,如果为写入双字节数值,需要写2次,其原理分别如图2所示。WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
图2 双字节数值的通讯原理示意图WWcW_PLCJS_COM-PLC-技.术_网
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
3 PLC与计算机的硬件连接WWW_PL※CJS_COM-PLC-技.术_网
现在RS232接口的使用已愈来愈广泛,它不仅用于计算机之间的通讯,而且还用于计算机和各种外围设备之间的通讯。因此它是微型机应用系统的一种重要接口。IP1612-220就采用RS232接口,它与计算机之间的接口连线如图3所示。WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLCJS@_COM%-PLC-技.术_网
图3 PLC与计算机之间的接口连线图WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
4 PLC与计算机在C++Builder环境下的软件实现WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
如何用C++Builder来实现PLC与上位机之间的通讯问题?C++Builder是一个基于真正C++语言的RAD开发工具,它将当今最为强劲高效的C++语言和随心所欲的可视化开发完美结合。在C++Builder中,不能够使用Turbo C中的outputb和inputb端口读写函数。但可以有另外一种办法实现这个功能,即通过内嵌汇编语言实现端口的读写。即在C++Builder的单元头文件(*.h)中加入如下代码:WWW.PLCJS.COM——可编程控制器技术门户
void _fastcall TForm1::OutPort(unsigned short port,unsigned char value) P.L.C.技.术.网——可编程控制器技术门户
//port参数为输出端口地址,value参数为输出值WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
{ asm{WWW_P※LCJS_CO※M-PLC-技-.术_网
mov dx , port //把端口地址送到处理器DX寄存器中 ——可——编——程——控-制-器-技——术——门——户
mov al , value //把value 送到处理器AL寄存器中 plcjs.技.术_网
out dx , al //把AL寄存器中的值送到端口} WWW_PLCJS@_COM%-PLC-技.术_网
}WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
unsigned char _fastcall TForm1::InPort(unsigned short port) WWcW_PLCJS_COM-PLC-技.术_网
//port参数为输入端口地址,返回为输入值WWW_PLCJS@_COM%-PLC-技.术_网
{ unsigned char value ; WWcW_PLCJS_COM-PLC-技.术_网
asm{ WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
mov dx, port //把端口地址送到处理器DX寄存器中 WWW_PLCJS_COM-PLC-技.术_网
in al, dx 从DX指定端口中将一数据送到AL寄存器中P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
mov value,al //把AL寄存器中的值赋给value}WWcW_PLCJS_COM-PLC-技.术_网
return value; //返回端口数据W1WW_P4LCJS_COM-PLC-技.术_网
} WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
编写好端口读写函数以后,我们必须把PLC与上位机的通讯模式设置成一致。EPS支持串行接口“Com1”到“Com9”。WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
如果想用通道1,可以用下列命令:WWW_PLCJS_COM-PLC-技.术_网
mode com1: 1200,n,8,1WW.W_PLC※JS_C,OM-PL,C-技.术_网
然后在C++Builder的单元头文件(*.cpp)中加入如下代码:WWW_P※LCJS_COM-PLC-)技.术_网
void _fastcall TForm1::FormCreate(TObject *Sender)P.L.C.技.术.网——可编程控制器技术门户
{outport(0x3f8+3,0x80);//以下是对com1口初始化,WWW_PLC※JS_COM-PmLC-技.术_网
outport(0x3f8+0,0x60);//波特率1200WWW_PLCJS_COM-PLC-技.术_网