上位机与PLC基于Fins/UDP通信

Fins/UDP通信

编写上位机通过发送Fins/UDP命令读写plc内部数据,可以用于上位机socket通讯测试,员工操作监控,运行日志打印。Fins/UDP是以十六进制字符发送命令,所以所有字符在发送前都需要将其转换成十六进制。

写格式

固定头:800002		不变
plc节点:006E00		地址:XXX.XXX.XXX.110
PC节点:00F400		地址:XXX.XXX.XXX.244
结束:00				不变
写代码:0102			不变
D区代码:82			不变
D区地址:01A600		根据需求修改,十六进制数据
写入长度:0001		根据需求修改,十六进制数据
写入数据:0212		

写反馈

固定头:C00002		不变
PC节点:00F400		地址:XXX.XXX.XXX.244
plc节点:006E00		地址:XXX.XXX.XXX.110
结束:00				不变
写代码:0102			不变
写入成功:0000

读格式

固定头:800002		不变
plc节点:006E00		地址:XXX.XXX.XXX.110
PC节点:00F400		地址:XXX.XXX.XXX.244
结束:00				不变
读代码:0101			不变
D区代码:82			不变
D区地址:01A600		根据需求修改,十六进制数据
读取长度:0002		根据需求修改,十六进制数据
	

读反馈

固定头:C00002		不变
PC节点:00F400		地址:XXX.XXX.XXX.244
plc节点:006E00		地址:XXX.XXX.XXX.110
结束:00				不变
读代码:0101			不变
plc状态:0000		自动变换
plc反馈的数据:66664006	

进制间转换函数

int型与字符串转16进制,16进制转字符串。

int-to-16进制

int num=666;
QString Dnum = QString::number(num,16);

字符串-to-16进制

QByteArray ReadPLC::QString2Hex(QString str)
{
    QByteArray senddata;
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2);
    char lstr,hstr;
    for(int i=0; i<len; )
    {
        hstr=str[i].toLatin1();
        if(hstr == ' ')
        {
            i++;
            continue;
        }
        i++;
        if(i >= len)
            break;
        lstr = str[i].toLatin1();
        hexdata = ConvertHexChar(hstr);
        lowhexdata = ConvertHexChar(lstr);
        if((hexdata == 16) || (lowhexdata == 16))
            break;
        else
            hexdata = hexdata*16+lowhexdata;
        i++;
        senddata[hexdatalen] = (char)hexdata;
        hexdatalen++;
    }
    senddata.resize(hexdatalen);
    return senddata;
}

char ReadPLC::ConvertHexChar(char ch)
{
    if((ch >= '0') && (ch <= '9'))
        return ch-0x30;
    else if((ch >= 'A') && (ch <= 'F'))
        return ch-'A'+10;
    else if((ch >= 'a') && (ch <= 'f'))
        return ch-'a'+10;
    else return (-1);
}

16进制-to-字符串

	自行补充

Fins/UDP通信

读函数与写函数都差不多,读写反馈可以使用信号槽来监听新数据,也可以直接后面写函数来读取,只不过需要做一下延时处理。

读写函数

/*函数功能:读取PLC数据
函数参数说明:
*bindPort:plc端口
*bindIP:plcIP
*winIP:PCIP
*IO:读取位数
*WID:读取地址
*/
void ReadPLC::readplcdata(QString bindPort,QString bindIP, QString winIP, int IO, int WID)
{
    QString plcip,winddowip;      
    int plcIPEnd = bindIP.split(".").at(3).toInt();
    plcip = QString::number(plcIPEnd,16).toUpper();   

    int winIPEnd = winIP.split(".").at(3).toInt();
    winddowip = QString::number(winIPEnd,16).toUpper();  //得到win的十六进制

    if(plcip.size()==1){
        plcip = "0"+plcip;
    }
    if(winddowip.size()==1){
        winddowip = "0"+winddowip;
    }

    QString ID = intTo16(WID);   
    QString writeIO = "000"+QString::number(IO,16).toUpper();     
    QString plcwrite = "80000200"+plcip+"0000"+winddowip+"0000010182";

    plcwrite +=  ID+"00000"+QString::number(IO); 
    QByteArray data = QString2Hex(plcwrite);  //字符串转16

    udpsocket->writeDatagram(data, QHostAddress(bindIP), quint16(bindPort.toInt()));
}

读写反馈

void ReadPLC::Read_plc_data()
{
    QByteArray datagram;
    datagram.resize(int(udpsocket->pendingDatagramSize()));
    udpsocket->readDatagram(datagram.data(),datagram.size());
    QString str = datagram.data();
    QString byte = datagram.toHex();
    if(!byte.isEmpty())
    {
        // qDebug()<<"16进制:"<<datagram.toHex();
         QString str_rev = QString(datagram.toHex(' ').toUpper().append(' '));
         qDebug()<<"data:"<<str_rev;
		//转换为字符
    }
}

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
fins/tcp 手册是一份涵盖 FINS(Factory Interface Network Service)和 TCP(Transmission Control Protocol)的技术文档。FINS 是一种用于工厂自动化系统的通信协议,而 TCP 是一种常用的传输层协议,用于在网络上可靠地传输数据。 fins/tcp 手册主要提供了关于 FINS 和 TCP 协议的详细信息,包括协议的结构、通信的原理、数据传输的方式等。它向用户提供了使用 FINS 和 TCP 进行通信的指南和操作步骤。 首先,手册介绍了 FINS 协议的特点和设计原理。它解释了如何建立 FINS 连接,包括设置 IP 地址、端口号和连接参数等。此外,手册还介绍了 FINS 数据报文的格式和各字段的含义,以帮助用户理解和使用 FINS 协议。 其次,手册详细介绍了 TCP 协议的基本原理和功能。它解释了 TCP 的可靠性传输机制,包括序列号、确认应答和重传等机制。手册还介绍了 TCP 的连接建立和终止过程,并提供了使用 TCP 进行数据传输的示例。 此外,手册还介绍了如何在工厂自动化系统中使用 FINS/TCP 协议进行数据通信。它包括了客户端和服务器端的配置步骤,以及发送和接收数据的方法。手册还介绍了常见的问题和故障排除方法,以帮助用户解决通信中的问题。 总的来说,fins/tcp 手册是一份重要的技术文档,它提供了全面且实用的关于 FINS 和 TCP 的信息。无论是对于工厂自动化系统的工程师,还是对于对 FINS 和 TCP 有兴趣的人来说,这本手册都是一个宝贵的参考资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撸BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值