PLC操作简单示例(读写指定寄存器)

最近写的一个程序要和生产线的PLC连动(特定条件下读写指定寄存器),

查询了一些PLC的操作资料,做了一个测试程序:


        private void btnRead_Click(object sender, EventArgs e)
        {
            try
            {

                Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = Dns.GetHostEntry(this.txtIP.Text.Trim()).AddressList[0];
                IPEndPoint ipend = new IPEndPoint(ip, int.Parse(this.txtPort.Text.Trim()));
                sock.Connect(ipend);

                byte[] cmd;
                byte[] rec;

                cmd = createCommand("R", int.Parse(this.txtStartAddr.Text), 1);
                sock.Send(cmd);

                Thread.Sleep(1000);

                rec = new byte[sock.Available];
                sock.Receive(rec);
                this.txtRegInfo.Text = this.txtRegInfo.Text + Environment.NewLine + " <读取> " + b2s(rec);

                sock.Shutdown(SocketShutdown.Both);
                sock.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        private void btnStop_Click(object sender, EventArgs e)
        {

            try
            {
                this.mutexforsocket.WaitOne();
                Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = Dns.GetHostEntry(this.txtIP.Text.Trim()).AddressList[0];
                IPEndPoint ipend = new IPEndPoint(ip, int.Parse(this.txtPort.Text.Trim()));
                sock.Connect(ipend);

                byte[] cmd;
                byte[] rec;
               
                cmd = createCommand("W", int.Parse(this.txtStartAddr.Text), 0x3130);
                sock.Send(cmd);

                Thread.Sleep(1000);

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在QT中读写PLC寄存器可以使用串口通信或者TCP/IP通信。对于串口通信,你可以使用QSerialPort类来设置串口参数并打开串口,然后通过串口发送数据给PLC。下面是一个串口通信的示例代码: ``` serial->setPortName("com4"); serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data7); serial->setParity(QSerialPort::EvenParity); serial->setStopBits(QSerialPort::OneStop); if(serial->open(QIODevice::ReadWrite)) { qDebug()<<"connect success"; } // 发送数据给PLC QString command = "01 14"; QString address = convert10216(ui->address->text().toInt(), 6); QString data = command + " " + address + " " + otherData; QByteArray array = QByteArray::fromHex(data.toLatin1()); serial->write(array); ``` 对于TCP/IP通信,你可以使用QTcpSocket类来与PLC进行通信。首先初始化一个QTcpSocket对象,并设置连接的参数,然后通过连接PLC成功的信号槽函数来进行读写操作。下面是一个TCP/IP通信的示例代码: ``` network = new QTcpSocket(this); timeout = 1000; // 初始化连接 connect(network, &QTcpSocket::connected, [](){ qDebug() << "Connected to PLC successfully!" << endl; }); connect(network, &QTcpSocket::disconnected, [](){ qDebug() << "Disconnected from PLC!" << endl; }); connect(network, &QTcpSocket::stateChanged, [](QAbstractSocket::SocketState socketState){ qDebug() << "SocketState changed: " << socketState; }); connect(network, &QTcpSocket::readyRead, [&(){ readData(); }); // 发送数据给PLC QString command = "01 14"; QString address = convert10216(ui->address->text().toInt(), 6); QString data = command + " " + address + " " + otherData; QByteArray array = QByteArray::fromHex(data.toLatin1()); network->write(array); network->waitForBytesWritten(); network->flush(); ``` 以上是使用QT读写PLC寄存器示例代码,你可以根据你的具体情况进行参数设置和数据发送。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值