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

本文介绍了在使用Qt通过snap7动态库与PLC通信时遇到的数据模式转换问题。当尝试写入quint32类型数值500时,由于PLC采用大端模式存储,而计算机默认使用小端模式,导致实际写入的数值错误。为解决此问题,读取和写入数据时需进行大小端模式转换。在读取时使用qFromBigEndian()函数,写入时同样需要转换。作者在实践中发现qFromBigEndian()能正确实现转换,并分享了相关代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值