QT下使用QTcpSocket与三菱FX5系列PLC通信实现

1 篇文章 0 订阅

与三菱PLC通信走MC协议,看了一下三菱通信方面文档,用QT写了一个通信类,目前实现读取M,X,Y,D区数据,写入M和D区数据(都可批量读写)
根据三菱 MELSEC iQ-FFX5用户手册(SLMP篇) 实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体需要看三菱文档

代码实现:

//读D区数据实现
	int nAllLen = 9;
    QByteArray data;
    QByteArray revData;
    data = build(address,size,READ,SUB_WORD,D);
    socket->write(data);
    socket->waitForBytesWritten();
    if(socket->waitForReadyRead()) {
        revData = socket->readAll();
    }
    int nLen = ResDataLen(revData);
    nAllLen += nLen;
    if(0 != ResError(revData)) {
        return 1;
    }
    memcpy(pData,revData.data()+11,nLen-2);
//读M区数据实现
int nAllLen = 9;
    QByteArray data;
    QByteArray revData;
    int sizeM = size;
    if(sizeM <= 2) {
        sizeM = 1;
    }else {
        if(sizeM%2 == 0)  {
            sizeM = sizeM/2;
        }else {
            sizeM = (sizeM + 1)/2;
        }
    }
    data = build(address,size,READ,SUB_BIT,M);
    socket->write(data);
    socket->waitForBytesWritten();
    if(socket->waitForReadyRead()) {
        revData = socket->readAll();
    }
    int nLen = ResDataLen(revData);
    nAllLen += nLen;
    if(0 != ResError(revData)) {
        return 1;
    }
    uint8_t *dataTemp = new uint8_t[sizeM];
    uint8_t *dataM = new uint8_t[size];
    memcpy(dataTemp,revData.data()+11,nLen-2);
    int nNum = 0;
    for(int i = 0; i < sizeM; i++) {
        uint8_t firstFourBits = (dataTemp[i] >> 4) & 0x0F;    //firstFourBits
        uint8_t lastFourBits = dataTemp[i] & 0x0F;         //lastFourBits
        if(0 == i) {
            memcpy(dataM+nNum,&firstFourBits,1);
            nNum += 1;
            if(nNum < size) {
                memcpy(dataM+nNum,&lastFourBits,1);
            }
        } else {
            memcpy(dataM+nNum,&firstFourBits,1);
            nNum += 1;
            if((nNum) < size) {
                memcpy(dataM+nNum,&lastFourBits,1);
            }
        }
        nNum++;
    }
    memcpy(pData,dataM,size);
    delete [] dataM;
    delete [] dataTemp;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值