先了解大小端数据模式,可以先看另一篇博客:https://www.cnblogs.com/ivint/p/14361782.html
项目背景:现需要使用Qt与PLC通信(使用snap7动态库链接),往PLC中写数据,当我写了数据类型为quint32的500时,而PLC中实际写入的为一串很大的数字(4093706240),
分析:PLC中DB1块0区存储了32位数据500,它的二进制为:0000,0000|0000,0000|0000,0001|1111,0100。
计算机读取显示的是4093706240,它的二进制为:1111,0100|0000,0001|0000,0000|0000,0000。这是因为PLC中存储为大端模式,计算机中以小端模式进行存储的。具体查看计算机是以大端还是小端模式存储的可以看https://blog.youkuaiyun.com/litter_driver777/article/details/51636311。所以读取和存储都需要进行大小端模式的转换。
具体代码参考:
读取PLC中的数据:
//读取硬触发时间间隔
quint32 readDelayTime;
int DelayTimeDataSize = sizeof(readDelayTime);
m_plcClient->DBRead(1, 2, DelayTimeDataSize, &readDelayTime);
readDelayTime = qFromBigEndian(readDelayTime);//PLC中为大端模式存储,而计算机中以小端模式存储,所以需要将大端模式数据转成小端模式数据
qDebug() << "PLC中硬触发延迟时间:" << readDelayTime;
往PLC中写入数据:
quint32 setDelayTime;
int DelayTimeDataSize = sizeof(setDelayTime);
setDelayTime = qFromBigEndian(delayTime);
m_plcClient->DBWrite(1, 2, DelayTimeDataSize, &setDelayTime);//写数据
在往PLC中写入数据时,一开始使用qFromLittleEndian(delayTime)的,发现从小端模式转成大端模式未成功,然后用qFromBigEndian(delayTime)倒是成功了,具体原因还没查清,希望大佬指正,^_^