2026-04-04 13:00:10
摘要:一、MQTT通信
1. 工业互联数据交换协议
HTTP:短连接 长连接
CoAP (Constrained Application Protocol),受限应用协议,应用于无线传感网中协议。
MQTT (Message Queuing Telemetry Transport ),消息队列遥测传输,由 IBM 开发的即时通讯协议。
DDS(Data Distribution Service for Real-Time Systems),面向实时系统的数据分布服务。
AMQP(Advanced Message Queuing Protocol),先进消息队列协议 RabbitMQ
XMPP(Extensible Messaging and Presence Protocol)可扩展通讯和表示协议 XML
JMS (Java Message Service),即消息服务,这是JAVA平台中著名的消息队列协议
2. MQTT
一种基于发布/订阅模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
极少的数据完成远程通信
核心内容:
MQTT定义:轻量级发布/订阅消息协议,适用于低带宽、高延迟网络。
核心特点:低开销、异步通信、支持QoS(0/1/2)。
适用场景:物联网设备通信、工业设备监控(如MES中的设备状态上报)。
通信过程
服务端/Broker
客户端(App/Device)
通信概念:登录注册(Client ID)、订阅、主题、负载、发布、消息、服务质量
通信细节:
基于TCP协议的应用层协议
固定报头
可变报头
载荷内容
3. 固定报头
如:0010 0100
消息类型(第一个字节的高4位)
标志位(第一个字节的低4位)
消息长度:长度扩展,最大长度256M数据
4. 可变报头
连接标志
报文标识符(2字节) ,发布、订阅、取消订阅
5. 通信载荷
6. MQTT主题过滤
主题层级分隔符:“/”,用于将结构化引入主题名 A套/客厅/电视、A套/客厅/空调
通配符: “#”、“+”、“$”,作用:订阅的主题过滤器可以包含特殊的通配符,允许你一次订阅多个主题。
种类:
# 当前节点下的所有节点,包括父级
例:A/# 包括A、A/B、A/B/C ……
阅读全文
2026-03-28 11:53:07
摘要:一、SECS/GEM
1. SECS/GEM通信
Semiconductor Equipment Communication Standard/Generic Equipment Model(半导体通用设备通信标准/通用设备模型)是半导体制造设备之间进行通信的标准协议。它定义了一套标准消息格式和通信规则,以便设备能够有效地与制造执行系统(MES)或工厂自动化系统进行通信和数据交换。
主要用于半导体制造设备,如晶圆加工机、封装机、测试设备等。这些设备需要通过SECS/GEM协议与工厂自动化系统进行数据交换和控制。
在高度自动化的半导体制造厂中,CIM(Computer Integrated Manufacturing【计算机整合制造】) 统一管理各设备的生产流程,并随时监控设备过程的状态,以减少过程失误进而降低成本及提升产品的质量。但随着过程的不同,各设备有着不同特性的差异且各制造商所提供的设备也不尽相同,因此增加CIM自动化管理的困难与复杂程度。软件集成自动化存在的主要问题是在不同的设备供应商之间没有标准的通讯协议。设备供应商不向半导体生产商开放通讯协议及接口软件,这使得半导体生产商不得不建立他们自己的软件“连接”,导致了项目费用的巨大增加。
SECS/GEM是由国际半导体设备与材料协会(SEMI)的会员一起构建的连接性标准。应用于在设备和工厂管理系统间的通讯标准。是半导体的设备接口协议,用于设备到主机的数据通讯。经过引入SECS/GEM,制造可以搜集更多的信息,SECS/GEM使设备和主机中心可以畅通无阻地停止通讯,从而完成智能工厂自动化。
2. 仿真环境
SEComSimulator — 需要.NET Framework 3.5
SECS Emulator 功能上是一样 建议使用上面的
WireShark / TCP调试助手(报文测试)
3. SECS/GEM结构与流程
协议结构
通信方式:RS232(SerialPort)、TCP/IP(Socket—IP地址 Port 进行Connect)
通信流程-HSMS
4. 消息报文主体结构
Message Length (4 Bytes)
Message Header (10 Bytes)
Message Text (0 to ~ 8 Mbytes)……
阅读全文
2026-03-21 23:00:32
摘要:一、三菱PLC协议
1. 三菱PLC设备
PLC以及相关通信模块:FX、Q、R、L、A
通信模块:C24、E71
2. 三菱PLC存储区与访问规则
3. 通信协议
MC协议:
公开
支持Ascii以及二进制两种数据格式
协议体系:串口:1C、2C、3C、4C 以太网:4E、3E、1E
Modbus、MX-Component
请求流程,WireShark监控通信过程,McProtocol库测试使用:仿真环境验证
(1)建立TCP连接 Scoket Connect
(2)执行相关操作 读、写
字节序:
小端 byte[] bytes {低 高 _ _ _ _ } 报文中的字节序小端模式
123 0x00,0x7B bytes[0]=0x7B bytes[1]=0x00
4. 功能操作分类
读
成批读出:字、位 :指定一个地址 D0 指定一个数量 返回相关数据 连续请求数据
字单位的随机读出 :不连续的地址请求 D0 D100 W10 每个地址读一个长度
多块成批读出 :不连续的地址 地址带长度 位按字处理?
写
成批写入:字、位
随机写入:字、位
多块成批写入
5. 成批读出报文
// 发送批量读取请求报文:0401
// 按字从 D05 地址开始请求 3个地址的数据
// D存储区,一个地址就是一个字(两个字节)
// 3*2=6个字节的数据响应返回
// 按位从 M10 地址开始请求5个地址的数据 10 - 0A 00 00
// M存储区,按位进行地址分配(ON/OFF)
// 3个字节 M10 M11 M12 M13 M14
// 0x11 0x00 0x10
//
// *******按位从X123地址请求********
// 起始地址 123 00 01 23 - 0x23 0x01 0x00
//
// 按字从 M10 地址开始 请求20个地址的数据 M10 M11 M12 ..... M29
// 一个字存16个状态 20-》需……
阅读全文
2026-03-14 12:28:34
摘要:一、欧姆龙协议
1. 欧姆龙通信设备
PLC:系列 CS系列、CJ系列、CP系列、NJ/NX系列
微型:CPM1A、CPM2A、CP1H、CP1L
小型:CPM2C、CQM1H、CJ1M
中型:C200H、CJ1、CS1
大型:CV、CS1D
运动控制器:NJ、NX等
2. 欧姆龙PLC存储区
存储区分类
CIO:I/O继电器区、DM:数据区
WR:工作区,内部继电器
HR:保持继电器
AR:是模拟通道
C:计数器 、 T:定时器
访问规则
最小存储单位是Word 2字节
bit、Word、Dword
访问地址: 字
0.0 CIO0.1 CIO0.15 D100 W100 W100.2
支持Modbus协议/OPC
3. FINS串口通信
特点
文档支持
Commands(5-1-1)
Memory Area(5-2-2)
End Codes(5-1-3)
PLC 默认存储 大端
请求
响应
报文格式
static void FINS_Serial_Test()
{
SerialPort serialPort = new SerialPort(COM1);
serialPort.Open();
string unit_num = 23;
ushort byte_addr = 100;
byte bit_addr = 0;
ushort count = 5;
string cmd = $@{unit_num}FA000000000010182 +
${byte_addr.ToString(X4)}{bit_addr.ToString(X2)}{count.ToString(X4)};
// 计算 FCS 校验
var fcs = FCS(cmd);
cmd += fcs;
// * \r
cmd += *\r;
byte[] req = Encoding.ASCII.GetBytes(cmd);
serialPort.Write(req, 0, req.Length);
byte[] resp = new byte[serialPort.BytesToRead……
阅读全文
2026-03-08 19:23:54
摘要:一、西门子S7协议
1. 西门子PLC设备
PLC:系列 LOGO、200、200Smart、300、400、1200、1500
2. 西门子PLC存储区
存储区分类
I:输入、Q:输出、AI:模拟量输入、V/DB:变量存储区 Modbus 线圈状态Q 输入线圈I 输入寄存器AI 保持型寄存V
AQ:模拟量输出、M:位存储区、T:定时器存储区、C:计数器存储区、HC:高速计数器、AC:累加器、SM:特殊存储器、L:局部存储区、S:顺序控制继电器 S7
访问规则
类型:bit、Byte、Word、Dword 对应数组
访问地址:最小存储是字节
I0.0 Q1.3 MB10 MW10 M10.0 VW100 V100.1 DB1.DBX100.5 位地址最大:7
3. 通信协议
Modbus协议/OPC
功能有限 NModbus4
S7
私有协议,非公开
功能强大,大部分功能都能完成
通信模式:主从(客/服,单边通信)、伙伴(双边通信,PLC-PLC)
请求流程,可以使用 Wireshark 监控通信过程,S7.NET库测试使用/sharp7
建立TCP连接 Socket.Connect
发送访问请求 COTP
交换通信信息 Setup Communication
执行相关操作 ….
4. S7COMM-COTP报文
COTP报文
第一次交互
请求与响应
byte[] bytes = new byte[] {
// TPKT
0x03,
0x00,
0x00,0x16,
// COTP
0x11,
0xe0, // 表示连接请求
0x00,0x00,
0x00,0x01,
0x00,
// 0xc0
0xc0,
0x01,
0x0a,// 2的10次方 1024
// 0xc1 通信源对应的相关配置 PC
0xc1,
0x02,
0x10, // S7双边模式 也可以选择01- PG 02 OP
0x00, // 不需要设置机架和插槽
// 0xc2
0xc2,
……
阅读全文
2026-03-07 19:08:21
摘要:一、Modbus协议
**1. Modbus通信方式与分类 **
串口 RS485(一主多从),不同的报文格式:
ModbusAscii(ASCII字符方式进行发送)
ModbusRTU(Remote Terminal Unit)
以太网(TCP点对点),报文格式一样。RTU over TCP 以TCP的方式发送RTU的报文
ModbusTCP
ModbusUDP
其他连接方式:byte[] 协议
2. Modbus协议下的数据存储
数据存储中的位bit (bool)、字节byte(8个位)、字Word(2个字节,16位)、双字DWord(2个字,4个字节,32位),C#中的数据显示:数据类型、显示格式
内存分区与功能:硬盘分区、功能码
存储区
对象类型
访问类型(针对程序)
存储区标识
说明
可用功能码
线圈状态
单个bit
读写
0XXXX
通过应用程序改变这种类型数据
读01 写 05 15
输入线圈
单个bit
只读
1XXXX
I/O系统提供这种类型数据
读02
输入寄存器
16-位 字
只读
3XXXX
I/O系统提供这种类型数据
读04
保持寄存器
16-位 字 2个字节
读写
4XXXX
通过应用程序改变这种类型数据
读03 写 06 16
Modbus功能码补充说明:
功能码 16进制
名称
功能
01
读线圈状态
读位(读N个bit)---读从机线圈寄存器,位操作
02
读输入离散量
读位(读N个bit)---读离散输入寄存器,位操作
03
读多个保持型寄存器
读整型、字符型、状态字、浮点型(读N个words)---读保持寄存器,字节操作
04
读多个输入寄存器
读整型、状态字、浮点型(读N个words)---读输入寄存器,字节操作
05
写单个线圈
写位(写一个bit)---写线圈寄存器,位操作
06
写单个保持寄存器
写整型、字符型、状态字、浮点型(写一个word)---写保持寄存器,字节操作
07
读取异常状态
取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
08
回送诊断校验
把诊断校验报文送从机,以对通信处理进行评鉴
09
编程(只用于4……
阅读全文
2025-04-12 23:21:56
摘要:一、实现DOM操作API
1. 构建环境
创建runtime-dom目录,存放dom操作api
创建runtime-core目录,存放允许时虚拟dom操作核心代码
在两个目录中分别构建环境
/packages/runtime-dom/package.json
{
name: @vue/runtime-dom,
module: dist/runtime-dom.esm-bundler.js,
unpkg: dist/runtime-dom.global.js,
buildOptions: {
name: VueRuntimeDOM,
formats: [
esm-bundler,
cjs,
global
]
}
}
/packages/runtime-core/package.json
{
name: @vue/runtime-core,
module: dist/runtime-core.esm-bundler.js,
unpkg: dist/runtime-core.global.js,
buildOptions: {
name: VueRuntimeCore,
formats: [
esm-bundler,
cjs,
global
]
}
}
2. 定义操作API
/packages/runtime-dom/src/nodeOps.ts
// dom操作 vue虚拟dom, 通过数据对象在内存中对比差异, 找到最小的改动点,使用dom操作完成更新。
// 原生dom操作api
export const nodeOps = {
// 插入, 追加
insert: (child, parent, anchor = null) = {
parent.insertBefore(child, anchor); // parent.appendChild(child)
},
// 删除子节点
remove: child = {
const parent = child.parentNode;
if (paren……
阅读全文
2025-04-05 18:21:43
摘要:Vue3响应式的实现跟Vue2最大的不同点是Vue3中的响应式是个独立模块,可以单独拿出来使用。
不仅仅响应式是模块化的,Vue3的设计理念也是基于模块化来设计的。而要使用Vue2的响应式,就必须加载整个Vue2的库。
一、rollup环境搭建
我们使用Vue3搭建上面的时候,经常会用到Vite,而Vite实际上是基于rollup实现的。
Rollup 是一个 JavaScript 模块打包工具,它可以将多个 JavaScript 文件(模块)打包成一个或多个优化后的文件。与 Webpack 类似,但 Rollup 更专注于 ES6 模块的打包,通常用于库/框架的开发。
除了rollup外,esbuild也是一个很不错的前端构建工具。
rollup
类库打包工具, 专注于模块的tree-shaking, 尽量减少模块打包的大小。
拥有庞大的插件生态系统,如代码拆分,语法转换等
常用于构建library, 特别是专注于es6模块
前端工程打包,一般使用webpack
esbuild
主要特点速度很快,用go编写,可以并行处理。
对ast语法树操作能力不太强, 老项目升级用esbuild
开发使用esbuild构建编译,生产打包使用成熟的rollup
接下来我们使用先使用rollup搭建一个本地环境
环境搭建
新建一个vue3的文件夹,然后安装rollup
yarn add rollup --dev
目录搭建
--packages # 因为Vue3是基于模块化来设计的,我们设计包文件的时候也分开构建,所以packages目录下都有会自己的项目文件
--reactivity # 响应式实现包
--dist
--node_modules
--src
index.ts
package.json
pnpm-lock.yaml
--shared # 公共库
--dist
--src
index.ts
package.json
--scripts
build.js
dev.js
.npmrc
package.json
pnpm-lock.yaml
rollup.config.js
tsconfig.json
基本配置
rollup.config.js
i……
阅读全文
2025-03-29 16:26:46
摘要:阅读vue(2.6)的源码,data响应式大概有如下4个过程:
数据代理:core/instance/state.js---vue函数---initMixin---initState---数据遍历---observer/index.js---Observer--- defineReactive---defineProperty
数据装载:$mount---装载template---compileToFunctions---mountComponet---创建【渲染Watcher】---Watcher.get()---Watcher.get()依赖收集---Dep.target就是当前的Watcher(data中的属性—dep-----watcher 形成双向引用)
数据相应式:需要修改data属性---触发setter回调执行---通知dep上的watcher更新dep.notify()---遍历所有的watcher并调用watcher的update方法---调用run方法---调用get()方法实现页面渲染
数据渲染:vm.__patch__---createPatchFunction---patchVnode---双方都有孩子节点updateChildrendiff代理
以下我们参考vue的源码,记录实现data响应式的全过程
一、数据劫持
收先我们混入一个方法,给Vue对象添加一个内部_init方法,我们在这个内部方法中去实现需要的功能
//index.js
import { initMixin } from ./init;
function Vue(options){ // vue2 配置项
console.log(my vue 6666)
this._init(options); // vue 内部约定 私有的方法或属性 一般是以 $ _ 开头
}
initMixin(Vue); // 一执行,Vue就有_init方法
export default Vue
//init.js 初始化
import { initState } from ./state;
// 混入 类似于 对象语言的继承
// 在不改变这个函数的前提下,给这个函数增加方法 增强功能
// 原理是在prototype上添加方……
阅读全文
2025-03-22 14:44:23
摘要:一、Vue3项目搭建
Node.js:是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O 模型,让JavaScript 运行在服务端的开发平台; 版本要求=12.0.0;
npm:Nodejs下的包管理器;版本要求 6.x yarn:包管理器;
yarn 包管理器是 npm 的一个替代方案,由Facebook于2016年10月发布。
Vite:是一个 web 开发构建工具,使用 Vite 可以快速构建 VUE 项目比webpack打包更加快速
快速的冷启动
即时的模块热更新
真正的按需编译
创建vite3项目:npm init vite,输入项目名称
安装依赖
cd vite-project 进入项目
依赖安装
npm install 或 cnmp i
运行vite项目:npm run dev
访问:http://localhost:5173
包管理工具Yarn的使用
yarn create vite:输入项目名称
cd vite-d2
安装依赖:yarn
项目启动:yarn dev
二、Vue3.2新特性
1. createApp
在 Vue 3 中,改变全局 Vue 行为的 API 现在被移动到了由新的 createApp 方法所创建的应用实例上。
import { createApp } from 'vue'
const app = createApp({})
该实例提供了一个应用上下文,由于 createApp 方法返回应用实例本身,因此可以在其后链式调用其它方法
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
const app = createApp(App);
app.use(store)
app.use(router)
app.mount('#app');
//合并之后的代码:
createApp(App).use(store).use(router).mount('#app')
2. setup函数
setup函数是vue3中专门为组件提供的新属性。
创建组件实例,然后初……
阅读全文