大、小端数据模式的应用-Qt与PLC连接

先了解大小端数据模式,可以先看另一篇博客: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.csdn.net/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)倒是成功了,具体原因还没查清,希望大佬指正,^_^

 

 

     

posted @ 2021-03-26 11:19  威海云博客  阅读(1014)  评论(0)    收藏  举报