1 原理分析
本文以三菱meclec a系列plc为例,讨论用c语言实现通讯的方法。
(1) plc串行通信
三菱a系列plc串行通信模式,plc中有2个rs-232异步通信串行接口,能方便用于双机、多机之间的通信,其通信模式有ascii和rtu两种方式。ascii模式下,信息是以冒号(:)字符表示帧的开始,cr(回车)、lf(换行)表示帧的结吏,换行符同时也起同步符作用,表示发送方已准备好接受即时应答。rtu(远程终端设备)模式下,帧的同步模拟同步报文来保持,即以字符间隔时间为起始位,若3.5个字符时间未收到新字符或帧尾,则刷新原值且以下-个接受到的字节为地址进行通信数据的接收。rtu报文的帧结构如表1所示。

本文以rtu模式为例加以分析。rtu模式下,采用标准为八个数据位(低位在前,高位在后)1个奇偶校验位和1个停止位。
(2) uart基本特性分析
微机实现异步通信是依靠适配器来完成的,而后者又是以uart芯片,即通用异步收发器芯片为核心构成的。
ibm pc的异步通信适配器使用的uart芯片为ins 8250。它是40引脚双列直插式封装的可编程异步通信接口芯片。现将8250中几个寄存器介绍如下(端口地址仅以com1为例)
a) 线路控制寄存器(端口地址3fb)
此寄存器用来设置通信参数。各位作用如下所示:
位(bit) 含义
0 字符长度(低位)
1 字符长度(高位)
2 停止位位数
3 奇偶校验允许
4 奇偶性选择
5 固定校验位选择
6 设置停顿
7 除数寄存器访问位
寄存器中字长的选择
位0 位1 字长
0 0 5
0 1 6
1 0 7
1 1 8
b) 线路状态寄存器(端口地址3fd)
此寄存器用来获得有关接收和发送数据的信息。各位作用如下所示
位(bit) 置为1时的含义
0 字符以接收到且放在接收缓冲寄存器中
1 接收缓冲寄存器中原有数据在读出之前
被新来数据破坏
2 输入字符奇偶校验错
3 输入字符停止位错
4 收到停顿信号(break)
5 uart以准备好接受下一个新的待发送字符
6 待传送字符以发出
7 不用
c) 除数寄存器(高位字节端口地址3f9,地位字节端口地址3f8)
波特率 十六进制数 低位字节 高位字节
2400 60h 0 60
4800 18h 0 18
9600 0ch 0 0c
2 应用研究
我们在开发低成本集散系统中,研究了plc与上位机ibm pc486之间的串行通信。
我们应用的plc具有模拟量输入和输出以及内嵌pid控制算法等功能。在工程现场,plc可针对被控制量的变化情况利用内嵌pid控制算法自动完成对调节回路中被控对象的控制。有时上位机需要了解现场参数,并进行pid算法的参数调整,这就要求plc和上位机之间能进行通信。而数据传送采用的波特率为9600bps,二进制方式。通信口的程序清单如下:
commini(int baud hi, int baud lo,int mode)
{
outportb(ox 3fb,ox,8o);//允许访问除数寄存器,以改变波特率//
outportb(ox 3f8,baud lo);//设置波特率低位//
outportb(ox 3f9,baud hi);//设置波特率高位//
outportb(ox 3fb,mode);//设置为读写方式,mode为1bh时,设置通信口为8个数据位,1个停止位,一个偶校验位//
}
通信子程序清单如下:
comm(int irt,int comm num, unsigned char data[ ])
{
int i, count, j;
switch(irt)
{
case 1;
for (i=0; i
++)
{
count=0
while(((inportb (ox3fb)&ox 01)=0) &(count<1000)
count=count+1
if(count=1000)
{
sound(10)
delay(2)
nosound( );
break:
}
else
comm datal[1]inportb
(ox3f8);
}
break;
case2;
for(i=0;i
{
count=0;
while(((inportb (ox3fd) &(ox20)=0)&(count<3000))
count=count+1;
if (count=3000)
{
sound(2500);
delay(100)
nosound( );
break;
}
else
outportb(ox3f8,data[i]);
}
break;
default;
printf("%s" "your command is wrong");
3 结束语
本文所述方法和程序是我们设计开发工作中的一部分,在dos和windows环境下应用效果良好。文中所列程序稍加改动就可应用到其他类型的通信系统中。