1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > c语言和PLC串口通信编程 用C语言实现PLC和上位机的串行通讯

c语言和PLC串口通信编程 用C语言实现PLC和上位机的串行通讯

时间:2019-05-21 04:38:16

相关推荐

c语言和PLC串口通信编程 用C语言实现PLC和上位机的串行通讯

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字长

005

016

107

118

b) 线路状态寄存器(端口地址3fd)

此寄存器用来获得有关接收和发送数据的信息。各位作用如下所示

位(bit) 置为1时的含义

0字符以接收到且放在接收缓冲寄存器中

1接收缓冲寄存器中原有数据在读出之前

被新来数据破坏

2输入字符奇偶校验错

3输入字符停止位错

4收到停顿信号(break)

5uart以准备好接受下一个新的待发送字符

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,intcomm 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环境下应用效果良好。文中所列程序稍加改动就可应用到其他类型的通信系统中。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。