1 软件需求

人机界面为MCGS 10寸触摸屏1062KW,接口为RS232/RS484/以太网,供电电源为24V。机触摸屏的功能为机器人的基本状态信息显示和对机器人的控制及参数给定。

目前设计的小车分成两栏共10格,需要将对应的触摸屏大致分成相应的10大格,会在工艺上规定每个格子只能放哪几类工件,然后在触屏上每个格子上给出相应的型号,下拉菜单或者缩略图等需要具体沟通,当来料小车停到位,工人在触屏上选好对应的工件,开启,触屏跟机器人控制柜通信,机器人控制柜控制碰焊机进行对应的碰焊作业。

采用RS232让触摸屏和贝加莱控制器通讯,通讯线缆距离大约为2米。控制信息包括:使能、启动、停止、急停、工件型号、槽位(1~10),数量,初始化(复位)。状态显示信息有机器人状态(就绪,使能,运行,暂停),故障信息,工序信息等。

2 通讯接口开发

2.1 硬件连接

触摸屏COM口RS485/RS232的通讯接口定义如下:

RS485 A+

RS485B-

RS232 RX

RS232 TX

GND

7

8

2

3

5

RS232需要将贝加莱控制器的RX连接触摸屏的3口,将控制器的TX连接至触摸屏2口,GND连接至触摸屏的5口。

2.2 通讯设备设置

RS232通讯设备采用通用串口父设备,子设备采用莫迪康ModbusRTU协议,添加以下设备窗口,如图2所示。

python开发工业触摸屏_串口

图2 添加通讯设备

       通用串口父设备的属性为:

串口端口号:RS232对应的是0-COM1,1-COM2对应的是RS485通讯

通讯波特率:11 - 57600bps

数据位:1 - 8位

停止位:0 - 1位

数据校验位:0 – 无校验

莫迪康ModbusRTU设备的属性需要设置设备的地址,将从站地址设为1,该地址需要与控制器下面的地址相对应。

2.3 通讯协议定义

(1)读取寄存器(功能码:03)

触摸屏请求指令格式为:

字节

0

1

2

3

4

5

6

7

含义

1

03

ADDRH

ADDRL

NUMH

NUML

CRCL

CRCH

地址

功能码

待读取参数首地址

指令数(参数个数1~125)

CRC校验

控制器响应指令格式为:

字节

0

1

2

3

4

5

6



含义

1

03

BYTECNT 

DATAH

DATAL

DATAH

DATAL

CRCL

CRCH

地址

功能码

响应字节数=

指令数*2

DATA1

DATA2

CRC校验

例:触摸屏请求读取地址为101的参数的值,控制器返回值为5

触摸屏请求:1 3 0 100 0 1 CRC

控制器响应:1  03  02  00  05 CRC

要读取的状态信息依次为:机器人状态,故障信息

(2)写乘法寄存器(功能码 16)

触摸屏向控制器连续写入多个字节,客户端发送数据格式为:

字节

0

1

2~3

4~5

6

7~8

……



含义

1

16

ADDR

NUM

BYTECNT 

DATA1

DATAn

CRCL

CRCH

地址

功能码

首地址参数

指令数

(1~100)

字节数

第1个数据

第n个数据

CRC校验

控制器响应返回数据格式为:

字节

0

1

2~3

4~5

6

7

含义

1

16

ADDR

NUM

CRCL

CRCH

地址

功能码

写入首地址

指令数

CRC校验

第1个槽位的地址为0020,共10个槽,依次写入每一个槽位放置的物料的类型

和数量

触摸屏发送:1 16 0 20 0 10 20 1 2 3 4 5 6 7 8 ……CRC

控制器返回:1  16  0  20  0 10 CRC

使能命令:

使能:地址为0001

启动:地址为0002

停止:地址为0003

急停:地址为0004

发送启动命令的数据为:
客户端请求: 1 16  0 2  0 1  2  0 1 CRC

服务器响应: 1 16   0 2   0 1  CRC

(3)CRC校验函数

cBuffer:计算CRC校验码的数组。
iBufLen:该数组的长度。
unsigned int CRC_Verify(unsigned char *cBuffer, unsigned int iBufLen)
{
    unsigned int i, j;                 //#define wPolynom 0xA001
    unsigned int wCrc = 0xffff;
    unsigned int wPolynom = 0xA001;
/*---------------------------------------------------------------------------------*/
    for (i = 0; i < iBufLen; i++)
    {
        wCrc ^= cBuffer[i];
        for (j = 0; j < 8; j++)
        {
            if (wCrc &0x0001)
            {   wCrc = (wCrc >> 1) ^ wPolynom;  }
            else
            {  wCrc = wCrc >> 1;  }
         }
     }
return wCrc;
}