1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > plc串口通讯 qt_QT与PLC通信

plc串口通讯 qt_QT与PLC通信

时间:2021-12-31 00:44:25

相关推荐

plc串口通讯 qt_QT与PLC通信

最近两天在学习QT与三菱PLC串口通信,特此记录下来。

通信格式

我这里使用RS-232C连接的,根据FX编程口协议!

设置参数,以读写的方式打开串口

serial->setPortName("com4");

serial->setBaudRate(QSerialPort::Baud9600);

serial->setDataBits(QSerialPort::Data7);

serial->setParity(QSerialPort::EvenParity);

serial->setStopBits(QSerialPort::OneStop);

if(serial->open(QIODevice::ReadWrite))

{

qDebug()<

这里简单说明一下三菱PLC通信字串的结构举个例子来说明如何使用

向寄存器D200中写入数值100:

首先查表D200首地址为1190,对应16进制码 31H 31H 39H 30H寄存器占两个字节也就是16位,写入数据100,转换成二进制0000 0000 0110 0100,数据位按照高位在前,低位在后排列,也就是说排列的时候为0110 0100 0000 0000 排列,4个二进制对应16进制为6 4 0 0,转换成36H 34H 30H 30H,根据协议确定字串为02H 31H 31H 39H 30H 30H 32H 36H 34H 30H 30H 03H最后求和校验,将前面数据【31H,03H】相加得22B,取后两位 32H 42H。

QString str="02 31 31 31 39 30 30 32 36 34 30 30 03 32 42";

QByteArray str1=QByteArray::fromHex(str.toLatin1().data());

serial->write(str1);

下面用串口调试助手读(将写入改成读取,删掉数据)一下寄存器里面得数据,可以看到得到的数据是6 4 0 0,高低位转换后0 0 6 4 ,0000 0000 0110 0010,和我们写入数据一致。

当然实际项目中,我们需要将实时获得的数据传给寄存器,就涉及到数据类型的转换

举个例子来说明

我们获得一个int类型的数据,比如30000个脉冲,现在需要把它写到寄存器D200中:

代码如下

long data_1=30000;

QString data_str=QString::number(data_1,16);

qDebug()

运行结果:

"02 31 31 31 39 30 30 32 "

str1 is "\x02"“1119002”

str2 is “0231313139303032”

data_str is “7530”

data_3 is “37353330”

data_4 is “02313131393030323735333003”

data_6 is 560

data_7 is “230”

data_8 is “30”

data_10 is “3330”

data_total is “023131313930303237353330033330”

data_total_hex is "\x02""11190027530\x03"“30”

我们打开PLC软件监视写入情况,发现结果和30000不一样

这是因为我们上面提到,写入数据排列有要求,比如y0-y17 ,写入的时候就应该按照y7-y0,y17-10;30000的16进制码7530,也就是说写入数据的时候应该是3075,如果数据不够16位,应该在前面补0到16位。

/10/16

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