文章目录

  • 前言
  • 一、HOSTLINK协议说明
  • 二、校验码(FCS)计算
  • 三、示例完整代码
  • 四、下载链接
  • 总结

前言

本文讲述了Qt下模拟串口调试工具发送HOSTLINK(FINS)模式,主要进行了HR保持区的字和位的读写,对HOSTLINK协议中校验码(FCS)的计算方式进行了展示,详情可见下文代码,希望可以帮助到大家,如有错误之处,欢迎大家批评指正。

项目效果


提示:以下是本篇文章正文内容,下面案例可供参考

一、HOSTLINK协议说明

HOSTLINK(FINS)命令细化的格式内容如下图所示

这里对FINS的命令格式进行解释(详细内容可见说明书)
(a)、command code(命令代码)
0101 :读命令
0102 :写命令
(b)、IO Memory Area Code(内存区域地址)
WR(Word):B1
WR(Bit):31
HR(Word):B2
HR(Bit):32
… …

此处以示例来进行上述格式说明:
//单写HR字地址(HR1写入数据1) 写:0102 字:B2
@ 00 FA 0 00 00 00 00 0102 B2 00 01(address) 00 00 01 0001(data) **(FCS) *\CR

//单读HR字地址(读取HR1地址上的数值) 读:0101 字:B2
@ 00 FA 0 00 00 00 00 0101 B2 00 01(address) 00 00 01 **(FCS) *\CR

//单写HR位地址(对HR1.01位写入数据1) 写:0102 位:32
@ 00 FA 0 00 00 00 00 0102 32 00 0101(address) 00 01 01(data) **(FCS) *\CR

//单读HR位地址(读取HR1.01位上的数值) 读:0101 位:32
@ 00 FA 0 00 00 00 00 0101 32 00 0101(address) 00 01 **(FCS) *\CR

二、校验码(FCS)计算

协议中FCS栏位:占用两个字符,取值为从@开始到正文结束的所有字符的ASCⅡ码按位异或运算的结果。计算校验码的步骤:
1.先进行输入地址位的转换
2.界面上显示的是ASCII字符,将界面上字符转化为十进制后进行按位异或运算
3.按位运算后的结果转换为16进制即为校验码

三、示例完整代码

1.示例中用到了串口相关函数,所以需要在pro中添加下列代码:

QT       += serialport

2.serialport.h

#ifndef SERIALPORT_H
#define SERIALPORT_H#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class SerialPort; }
QT_END_NAMESPACEclass SerialPort : public QWidget
{Q_OBJECTpublic:SerialPort(QWidget *parent = nullptr);~SerialPort();void initWidget();private slots:void slot_serialRead();void slot_writeHRWordData(int address, int numWrite);void slot_readHRWordData(int address);void slot_writeHRBitData(int address, int bit, int numWrite);void slot_readHRBitData(int address, int bit);void on_pb_refresh_clicked();void on_pb_operate_clicked();void on_pb_send_clicked();void on_rb_read_clicked();void on_rb_write_clicked();private:Ui::SerialPort *ui;QSerialPort *serial;
};
#endif // SERIALPORT_H

3.serialport.cpp

#include "serialport.h"
#include "ui_serialport.h"SerialPort::SerialPort(QWidget *parent): QWidget(parent), ui(new Ui::SerialPort)
{ui->setupUi(this);this->initWidget();
}SerialPort::~SerialPort()
{delete ui;
}void SerialPort::initWidget()
{this->setWindowTitle("HOSTLINK(FINS)读写测试");setFixedSize(this->width(),this->height());ui->rb_read->setChecked(true);ui->le_num->setEnabled(false);ui->pb_send->setEnabled(false);//初始化串口serial = new QSerialPort(this);connect(serial,SIGNAL(readyRead()),this,SLOT(slot_serialRead()));
}void SerialPort::slot_serialRead()
{QByteArray receiveBuf = serial->readAll();QString receiveStr = QString(receiveBuf);//qDebug()<<"receiveStr:"<<receiveStr;int sizeNum = receiveStr.size();QString showStr = receiveStr.left(sizeNum - 1);ui->plainTextEdit->appendPlainText("接收命令:\n" + showStr + "\\CR");QString leftStr = receiveStr.left(sizeNum - 4);//qDebug()<<"leftStr:"<<leftStr;QString rightStr = leftStr.right(sizeNum - 4 - 23);//qDebug()<<"receiveStr:"<<receiveStr<<"   leftStr:"<<leftStr<<"   rightStr:"<<rightStr;//rightStr需要视情况而定ui->le_num->setText(rightStr);
}//单写HR字地址
void SerialPort::slot_writeHRWordData(int address,int numWrite)
{//H保持区   字:B2 位:32//@ 00 FA 0 00 00 00 00 0102 B2 00 01(address) 00 00 01 0001(data) **(FCS) *\CR//QString testStr = "@00FA0000000000102B200010000010001";//addressQString startStr = "@00FA0000000000102B200";int adsNum[2];QByteArray hrBa;hrBa.setNum(address,16);if(address < 16){adsNum[0] = 0;adsNum[1] = address;startStr.append("0" + QString(hrBa) + "000001");}else{adsNum[0] = (int)hrBa.at(0);adsNum[1] = (int)hrBa.at(1);startStr.append(QString(hrBa) + "000001");}//qDebug()<<"num[0]:"<<num[0]<<"   num[1]:"<<num[1];//numWrite 根据写入值长度变化
#if 0QString numStr = QString::number(numWrite);QByteArray numBa = numStr.toLatin1();qDebug()<<"numBa:"<<numBa;int numSize = numStr.size();int numEnd = numSize;//qDebug()<<"numSize:"<<numSize;if(numSize%2){numEnd = numSize + 1;}//qDebug()<<"numEnd:"<<numEnd;int numNum[numEnd];if(numSize%2){numNum[0] = 0;for(int i=1;i<numEnd;i++){numNum[i] = (int)numBa.at(i-1);}startStr.append("0" + QString(numBa));}else{for(int i=0;i<numEnd;i++){numNum[i] = (int)numBa.at(i);}startStr.append(QString(numBa));}
#elseQString finStr = "";QString numStr = QString::number(numWrite);int numSize = numStr.size();if(numSize < 4){for(int i=numSize;i<4;i++){finStr.append("0");}finStr += numStr;}else if(numSize == 4){finStr = numStr;}else if(numSize == 5){finStr = "0" + numStr;}else if(numSize == 6){finStr = numStr;}else{finStr = "0000";}QByteArray numBa = finStr.toLatin1();//qDebug()<<"numBa:"<<numBa;int numEnd = finStr.size();//qDebug()<<"numEnd:"<<numEnd;int numNum[numEnd];for(int i=0;i<numEnd;i++){numNum[i] = (int)numBa.at(i);}startStr.append(QString(numBa));
#endifquint8 sendBuf[30+numEnd];memset(sendBuf+numEnd,0,30+numEnd);sendBuf[0] = (quint8)0x40;   //@   64sendBuf[1] = (quint8)0x30;   //0   48sendBuf[2] = (quint8)0x30;   //0   48sendBuf[3] = (quint8)0x46;   //F   70sendBuf[4] = (quint8)0x41;   //A   65sendBuf[5] = (quint8)0x30;   //0   48sendBuf[6] = (quint8)0x30;   //0   48sendBuf[7] = (quint8)0x30;   //0   48sendBuf[8] = (quint8)0x30;   //0   48sendBuf[9] = (quint8)0x30;   //0   48sendBuf[10] = (quint8)0x30;   //0   48sendBuf[11] = (quint8)0x30;   //0   48sendBuf[12] = (quint8)0x30;   //0   48sendBuf[13] = (quint8)0x30;   //0   48sendBuf[14] = (quint8)0x30;   //0   48sendBuf[15] = (quint8)0x31;   //1   49sendBuf[16] = (quint8)0x30;   //0   48sendBuf[17] = (quint8)0x32;   //2   50sendBuf[18] = (quint8)0x42;   //B   66sendBuf[19] = (quint8)0x32;   //2   50sendBuf[20] = (quint8)0x30;   //0   48sendBuf[21] = (quint8)0x30;   //0   48sendBuf[22] = (quint8)adsNum[0];   //0   48sendBuf[23] = (quint8)adsNum[1];   //1   49sendBuf[24] = (quint8)0x30;   //0   48sendBuf[25] = (quint8)0x30;   //0   48sendBuf[26] = (quint8)0x30;   //0   48sendBuf[27] = (quint8)0x30;   //0   48sendBuf[28] = (quint8)0x30;   //0   48sendBuf[29] = (quint8)0x31;   //1   49for(int i=0;i<numEnd;i++)   //data   1234{sendBuf[30+i] = numNum[i];}quint8 fcsNum = 0;for(int i=0;i<30+numEnd;i++){fcsNum ^= sendBuf[i];}QByteArray fcsBa;fcsBa.setNum(fcsNum,16);//qDebug()<<"fcsBa:"<<fcsBa;QString scsStr = "";if(fcsBa.size() == 1){scsStr = "0" + QString(fcsBa);}else{scsStr = QString(fcsBa);}//qDebug()<<"ab:"<<ab;startStr.append(scsStr + "*\r");QString lastStr = startStr.toUpper();//qDebug()<<"lastStr:"<<lastStr;int sizeNum = lastStr.size();QString showStr = lastStr.left(sizeNum - 1);ui->plainTextEdit->appendPlainText("发送写命令:\n" + showStr + "\\CR");char *writeStr;QByteArray writeBa = lastStr.toLatin1();writeStr = writeBa.data();qDebug()<<"writeStr:"<<writeStr;serial->write(writeStr);
}//单读HR字地址
void SerialPort::slot_readHRWordData(int address)
{//H保持区   字:B2 位:32//@ 00 FA 0 00 00 00 00 0101 B2 00 01(address) 00 00 01 **(FCS) *\CR//QString testStr = "@00FA0000000000101B20001000001";QString startStr = "@00FA0000000000101B200";//addressint adsNum[2];QByteArray hrBa;hrBa.setNum(address,16);if(address < 16){adsNum[0] = 0;adsNum[1] = address;startStr.append("0" + QString(hrBa) + "000001");}else{adsNum[0] = (int)hrBa.at(0);adsNum[1] = (int)hrBa.at(1);startStr.append(QString(hrBa) + "000001");}//qDebug()<<"num[0]:"<<num[0]<<"   num[1]:"<<num[1];quint8 sendBuf[30];memset(sendBuf,0,30);sendBuf[0] = (quint8)0x40;   //@   64sendBuf[1] = (quint8)0x30;   //0   48sendBuf[2] = (quint8)0x30;   //0   48sendBuf[3] = (quint8)0x46;   //F   70sendBuf[4] = (quint8)0x41;   //A   65sendBuf[5] = (quint8)0x30;   //0   48sendBuf[6] = (quint8)0x30;   //0   48sendBuf[7] = (quint8)0x30;   //0   48sendBuf[8] = (quint8)0x30;   //0   48sendBuf[9] = (quint8)0x30;   //0   48sendBuf[10] = (quint8)0x30;   //0   48sendBuf[11] = (quint8)0x30;   //0   48sendBuf[12] = (quint8)0x30;   //0   48sendBuf[13] = (quint8)0x30;   //0   48sendBuf[14] = (quint8)0x30;   //0   48sendBuf[15] = (quint8)0x31;   //1   49sendBuf[16] = (quint8)0x30;   //0   48sendBuf[17] = (quint8)0x31;   //1   49sendBuf[18] = (quint8)0x42;   //B   66sendBuf[19] = (quint8)0x32;   //2   50sendBuf[20] = (quint8)0x30;   //0   48sendBuf[21] = (quint8)0x30;   //0   48sendBuf[22] = (quint8)adsNum[0];   //0   48sendBuf[23] = (quint8)adsNum[1];   //1   49sendBuf[24] = (quint8)0x30;   //0   48sendBuf[25] = (quint8)0x30;   //0   48sendBuf[26] = (quint8)0x30;   //0   48sendBuf[27] = (quint8)0x30;   //0   48sendBuf[28] = (quint8)0x30;   //0   48sendBuf[29] = (quint8)0x31;   //1   49quint8 fcsNum = 0;for(int i=0;i<30;i++){fcsNum ^= sendBuf[i];}QByteArray fcsBa;fcsBa.setNum(fcsNum,16);//qDebug()<<"fcs:"<<fcs;QString scsStr = "";if(fcsBa.size() == 1){scsStr = "0" + QString(fcsBa);}else{scsStr = QString(fcsBa);}//qDebug()<<"ab:"<<ab;startStr.append(scsStr + "*\r");QString lastStr = startStr.toUpper();//qDebug()<<"lastStr:"<<lastStr;int sizeNum = lastStr.size();QString showStr = lastStr.left(sizeNum - 1);ui->plainTextEdit->appendPlainText("发送读命令:\n" + showStr + "\\CR");char *readStr;QByteArray readBa = lastStr.toLatin1();readStr = readBa.data();qDebug()<<"readStr:"<<readStr;serial->write(readStr);
}//单写HR位地址
void SerialPort::slot_writeHRBitData(int address,int bit,int numWrite)
{//H保持区   字:B2 位:32//@ 00 FA 0 00 00 00 00 0102 32 00 1900(address) 00 01 01(data) **(FCS) *\CR//QString testStr = "@00FA000000000010232001900000101";//addressQString startStr = "@00FA00000000001023200";int adsNum[2];QByteArray hrBa;hrBa.setNum(address,16);if(address < 16){adsNum[0] = 0;adsNum[1] = address;startStr.append("0" + QString(hrBa));}else{adsNum[0] = (int)hrBa.at(0);adsNum[1] = (int)hrBa.at(1);startStr.append(QString(hrBa));}//qDebug()<<"num[0]:"<<num[0]<<"   num[1]:"<<num[1];//bitint bitNum[2];QByteArray bitBa;bitBa.setNum(bit,16);bitNum[0] = 0;bitNum[1] = bit;startStr.append("0" + QString(bitBa) + "0001");//numWriteQString numStr = QString::number(numWrite);int numNum[2];numNum[0] = 0;numNum[1] = numWrite;startStr.append("0" + numStr);quint8 sendBuf[32];memset(sendBuf,0,32);sendBuf[0] = (quint8)0x40;   //@   64sendBuf[1] = (quint8)0x30;   //0   48sendBuf[2] = (quint8)0x30;   //0   48sendBuf[3] = (quint8)0x46;   //F   70sendBuf[4] = (quint8)0x41;   //A   65sendBuf[5] = (quint8)0x30;   //0   48sendBuf[6] = (quint8)0x30;   //0   48sendBuf[7] = (quint8)0x30;   //0   48sendBuf[8] = (quint8)0x30;   //0   48sendBuf[9] = (quint8)0x30;   //0   48sendBuf[10] = (quint8)0x30;   //0   48sendBuf[11] = (quint8)0x30;   //0   48sendBuf[12] = (quint8)0x30;   //0   48sendBuf[13] = (quint8)0x30;   //0   48sendBuf[14] = (quint8)0x30;   //0   48sendBuf[15] = (quint8)0x31;   //1   49sendBuf[16] = (quint8)0x30;   //0   48sendBuf[17] = (quint8)0x32;   //2   50sendBuf[18] = (quint8)0x33;   //3   51sendBuf[19] = (quint8)0x32;   //2   50sendBuf[20] = (quint8)0x30;   //0   48sendBuf[21] = (quint8)0x30;   //0   48sendBuf[22] = (quint8)adsNum[0];   //1   49sendBuf[23] = (quint8)adsNum[1];   //9   57sendBuf[24] = (quint8)bitNum[0];   //0   48sendBuf[25] = (quint8)bitNum[1];   //0   48sendBuf[26] = (quint8)0x30;   //0   48sendBuf[27] = (quint8)0x30;   //0   48sendBuf[28] = (quint8)0x30;   //0   48sendBuf[29] = (quint8)0x31;   //1   49sendBuf[30] = (quint8)numNum[0];   //0   48sendBuf[31] = (quint8)numNum[1];   //1   49quint8 fcsNum = 0;for(int i=0;i<32;i++){fcsNum ^= sendBuf[i];}QByteArray fcsBa;fcsBa.setNum(fcsNum,16);//qDebug()<<"fcsBa:"<<fcsBa;QString scsStr = "";if(fcsBa.size() == 1){scsStr = "0" + QString(fcsBa);}else{scsStr = QString(fcsBa);}//qDebug()<<"ab:"<<ab;startStr.append(scsStr + "*\r");QString lastStr = startStr.toUpper();//qDebug()<<"lastStr:"<<lastStr;int sizeNum = lastStr.size();QString showStr = lastStr.left(sizeNum - 1);ui->plainTextEdit->appendPlainText("发送写命令:\n" + showStr + "\\CR");char *writeStr;QByteArray writeBa = lastStr.toLatin1();writeStr = writeBa.data();qDebug()<<"writeStr:"<<writeStr;serial->write(writeStr);
}//单读HR位地址
void SerialPort::slot_readHRBitData(int address,int bit)
{//H保持区   字:B2 位:32//@ 00 FA 0 00 00 00 00 0101 32 00 1900(address) 00 01 **(FCS) *\CR//QString testStr = "@00FA0000000000102320019000001";//addressQString startStr = "@00FA00000000001013200";int adsNum[2];QByteArray hrBa;hrBa.setNum(address,16);if(address < 16){adsNum[0] = 0;adsNum[1] = address;startStr.append("0" + QString(hrBa));}else{adsNum[0] = (int)hrBa.at(0);adsNum[1] = (int)hrBa.at(1);startStr.append(QString(hrBa));}//qDebug()<<"num[0]:"<<num[0]<<"   num[1]:"<<num[1];//bitint bitNum[2];QByteArray bitBa;bitBa.setNum(bit,16);bitNum[0] = 0;bitNum[1] = bit;startStr.append("0" + QString(bitBa) + "0001");quint8 sendBuf[30];memset(sendBuf,0,32);sendBuf[0] = (quint8)0x40;   //@   64sendBuf[1] = (quint8)0x30;   //0   48sendBuf[2] = (quint8)0x30;   //0   48sendBuf[3] = (quint8)0x46;   //F   70sendBuf[4] = (quint8)0x41;   //A   65sendBuf[5] = (quint8)0x30;   //0   48sendBuf[6] = (quint8)0x30;   //0   48sendBuf[7] = (quint8)0x30;   //0   48sendBuf[8] = (quint8)0x30;   //0   48sendBuf[9] = (quint8)0x30;   //0   48sendBuf[10] = (quint8)0x30;   //0   48sendBuf[11] = (quint8)0x30;   //0   48sendBuf[12] = (quint8)0x30;   //0   48sendBuf[13] = (quint8)0x30;   //0   48sendBuf[14] = (quint8)0x30;   //0   48sendBuf[15] = (quint8)0x31;   //1   49sendBuf[16] = (quint8)0x30;   //0   48sendBuf[17] = (quint8)0x31;   //1   49sendBuf[18] = (quint8)0x33;   //3   51sendBuf[19] = (quint8)0x32;   //2   50sendBuf[20] = (quint8)0x30;   //0   48sendBuf[21] = (quint8)0x30;   //0   48sendBuf[22] = (quint8)adsNum[0];   //1   49sendBuf[23] = (quint8)adsNum[1];   //9   57sendBuf[24] = (quint8)bitNum[0];   //0   48sendBuf[25] = (quint8)bitNum[1];   //0   48sendBuf[26] = (quint8)0x30;   //0   48sendBuf[27] = (quint8)0x30;   //0   48sendBuf[28] = (quint8)0x30;   //0   48sendBuf[29] = (quint8)0x31;   //1   49quint8 fcsNum = 0;for(int i=0;i<30;i++){fcsNum ^= sendBuf[i];}QByteArray fcsBa;fcsBa.setNum(fcsNum,16);//qDebug()<<"fcsBa:"<<fcsBa;QString scsStr = "";if(fcsBa.size() == 1){scsStr = "0" + QString(fcsBa);}else{scsStr = QString(fcsBa);}//qDebug()<<"ab:"<<ab;startStr.append(scsStr + "*\r");QString lastStr = startStr.toUpper();//qDebug()<<"lastStr:"<<lastStr;int sizeNum = lastStr.size();QString showStr = lastStr.left(sizeNum - 1);ui->plainTextEdit->appendPlainText("发送读命令:\n" + showStr + "\\CR");char *readStr;QByteArray readBa = lastStr.toLatin1();readStr = readBa.data();qDebug()<<"readStr:"<<readStr;serial->write(readStr);
}void SerialPort::on_pb_refresh_clicked()
{ui->cb_port->clear();foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){QSerialPort serial;serial.setPort(info);if(serial.open(QIODevice::ReadWrite)){ui->cb_port->addItem(info.portName());serial.close();}}
}void SerialPort::on_pb_operate_clicked()
{if(ui->cb_port->currentText().isEmpty()){QMessageBox::information(this, tr("提示"),"请先刷新并进行串口选择!");return;}if(ui->pb_operate->text() == QString("OPEN")){QString portName = ui->cb_port->currentText();QString baudRate = ui->cb_baud->currentText();qDebug()<<"portName:"<<portName<<"   baudRate:"<<baudRate;QSerialPortInfo info(portName);if(info.isBusy()){qDebug()<<"The serial port is occupied"<<portName;return;}serial->setPortName(portName);serial->setBaudRate(baudRate.toInt());serial->setStopBits(QSerialPort::TwoStop);serial->setDataBits(QSerialPort::Data7);serial->setParity(QSerialPort::EvenParity);serial->setFlowControl(QSerialPort::NoFlowControl);bool flag = serial->open(QIODevice::ReadWrite);if(!flag){qDebug()<<QString("Failed to open serial port:")<<portName<<serial->errorString();serial->clearError();ui->pb_send->setEnabled(false);}else{qDebug()<<QString("The serial port is open:")<<portName;ui->pb_operate->setText("CLOSE");ui->pb_send->setEnabled(true);}}else{ui->pb_operate->setText("OPEN");serial->close();ui->pb_send->setEnabled(false);}
}void SerialPort::on_pb_send_clicked()
{//1.界面上显示的是ASCII字符//2.计算校验码的步骤//3.先进行输入地址位的转换//4.将界面上字符转化为十进制后进行按位异或运算//5.按位运算后的结果转换为16进制即为校验码int address = ui->le_address->text().toInt();int bit = ui->le_bit->text().toInt();int numWrite = ui->le_num->text().toInt();//单读if(ui->rb_read->isChecked()){if(ui->le_bit->text().isEmpty()){slot_readHRWordData(address);}else{slot_readHRBitData(address,bit);}}//单写if(ui->rb_write->isChecked()){if(ui->le_bit->text().isEmpty()){slot_writeHRWordData(address,numWrite);}else{slot_writeHRBitData(address,bit,numWrite);}}
}void SerialPort::on_rb_read_clicked()
{ui->le_num->setEnabled(false);
}void SerialPort::on_rb_write_clicked()
{ui->le_num->setEnabled(true);
}

4.serialport.ui

四、下载链接

我的示例百度网盘链接:https://pan.baidu.com/s/1eGnt6I7UVeN5p3n4bvLVTA
提取码:xxcj


总结

本文实现的与欧姆龙PLC进行的通信也是比较简单的,使用串口进行命令的发送,前提是对HOSTLINK协议有相应的了解,然后去实现该协议命令的组装,其中需要注意的一个点是FCS(校验码)的获取。本文还存在的局限是只进行了HR区域的读写,并且只能进行单独某地址或某位的读写,所以想要实现更多区域的读写就需要进行改进了,这里提供这样一个示例,希望可以帮助到大家。


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

参考博客:
欧姆龙plc交互协议hostlink
基于HostLink协议的Fins命令读写

Qt下实现欧姆龙PLC 串口发送HOSTLINK(FINS)模式相关推荐

  1. 【工控老马】欧姆龙PLC Socket发送Fins/TCP命令解析

    欧姆龙Socket tool发送Fins/TCP命令 实验设备:CJ2M-CPU33(PLC) 实验目的:发送Fins/TCP命令读写CJ2M-CPU33的数据 实验步骤: 1. 系统概述,硬件搭建和 ...

  2. windows 串口编程 c语言,windows下C语言版串口发送程序(基于VS2017)

    #include "tchar.h" #include int main() { /*****************************打开串口*************** ...

  3. 【IIOT】欧姆龙PLC数采之CP系列

    [IIOT]欧姆龙PLC数采之CP系列 前言 一.车间级数采系统架构 二.欧姆龙PLC介绍 三.CP系列产品说明 3.1. CPU规格 3.2. 内部寄存器 3.3. 支持协议 四.数采方案 4.1. ...

  4. 【IIOT】欧姆龙PLC数采之CJ2系列

    [IIOT]欧姆龙PLC数采之CJ2系列 前言 一.车间级数采系统架构 二.欧姆龙PLC介绍 三.CJ2系列产品说明 3.1. CPU规格 3.2. 内部寄存器 3.3. 支持协议 四.数采方案 4. ...

  5. 【IIOT】欧姆龙PLC数采之CJ1系列

    [IIOT]欧姆龙PLC数采之CJ1系列 前言 一.车间级数采系统架构 二.欧姆龙PLC介绍 三.CJ1系列产品说明 3.1. CPU规格 3.2. 内部寄存器 3.3. 支持协议 四.数采方案 4. ...

  6. 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭

    实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...

  7. C#.NET的界面编程--实例4:使用串口发送数据

    目录 一.[程序实现] 步骤1.先设计窗口,把各种需要的控制布局在窗口内 步骤2.制定应用的功能方案 步骤3.制定后台逻辑 二.[运行效果] 本节主要介绍了c# 使用线程对串口serialPort进行 ...

  8. linux串口助手cutecom,buntu下cutecom图像界面串口调试工具使用

    一.安装,首先下载这个软件,终端和软件中心均可下载,终端下载命令: sudo apt-get install cutecom 即可快速搞定安装问题. 软件中心: 由于我已经通过终端安装成功,所以软件中 ...

  9. 欧姆龙PLC HostLink通讯 C-MODE格式

    协议说明 HostLink C-mode可以直接通过PC连接欧姆龙PLC,可以直接读取/写入欧姆龙PLC寄存器的协议. 其中分为1对1,以及1对N模式,1对1表示1台PC只能连接一个PLC,1对N表示 ...

最新文章

  1. DOS MD命令三种用法
  2. OpenSSH(ssh + scp)+Telnet
  3. php读取dxf,分享个DXF转G代码的实例
  4. flink读取不到文件_日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践...
  5. 中文宾州树库标记含义
  6. 100.Day12反射机制_qq_38205875的博客
  7. 前端从入门到精通(记录自己的前端学习之路)都是一些自己做的笔记
  8. 腾讯视频转码,把qlv格式转换成mp4格式
  9. jax_ws_JAX-RS和OpenAPI对Hypermedia API的支持:任重而道远
  10. VLAN trunk实验
  11. 惊艳!ftrack和UE4,强强联合!
  12. XML Shema 笔记整理(1)
  13. 计算机网络之(7):TCP流量控制、拥塞控制 + 网络层
  14. 第三代CAN技术即将到来
  15. linux-Perl-语言入门
  16. 对今天知识的回顾15
  17. 使用VS Code开发AngularJS 2 第一个应用程序
  18. 提笔,再回忆~落笔,成悔,一切皆已随风:伤感日志
  19. 项目中,你们如何进行需求评审?
  20. [ALI-签约代扣] 小程序环境下的签约代扣

热门文章

  1. JAVA 实现朋友圈_Java实现微信公众平台朋友圈分享功能详细代码
  2. 灵魂筹码服务器不显示不出来,灵魂筹码不为人知的隐藏规则大全 鬼的差异性...
  3. 小技巧--使用异或来替换原本的常量交换
  4. [luogu3393]逃离僵尸岛
  5. RT-Robot助力机器人开发,让你再也不用重复“造轮子”
  6. Day8_ElectronicAlbum
  7. 栾川一高2021高考成绩查询,加油!栾川一高举行2021年高考百日冲刺誓师大会!...
  8. 报错“No module named version”和version安装 “cannot import name 'izip_longest' from 'itertools'”的解决
  9. Redis set命令详解
  10. 校内互测第一周(East!XI~East!XV)总结(窝还是退役吧QAQ