本仓库演示如何构建一个可复用的TCP通讯层(CSM-TCP-Router),将本地程序变成可远程控制的TCP服务器,展示了CSM框架隐形总线机制的优势。
- 所有本地可发送的CSM消息,均可通过TCP连接以CSM同步或异步格式转发给本地程序。
- 基于JKI-TCP-Server库,支持多个TCP客户端同时连接。
- [client] 提供一个标准的TCP客户端,可以连接到服务器,验证远程连接、消息发送等功能。
CSM-TCP-Router 中 TCP 数据包格式定义如下:
| 数据长度(4B) | 版本(1B) | TYPE(1B) | FLAG1(1B) | FLAG2(1B) | 文本数据 |
╰─────────────────────────── 包头 ──────────────────────────╯╰──── 数据长度范围 ─────╯
数据包类型字段为枚举值,用于描述数据包内容,目前支持以下类型:
- 信息数据包(
info) -0x00:服务端在客户端连接时(欢迎消息)和连接关闭时(告别消息)发送 - 错误数据包(
error) -0x01 - 指令数据包(
cmd) -0x02 - 指令响应数据包(
cmd-resp) -0x03 - 同步响应数据包(
resp) -0x04 - 异步响应数据包(
async-resp) -0x05 - 状态广播数据包(
status) -0x06 - 中断广播数据包(
interrupt) -0x07
详细的通讯协议定义, 见 协议设计
由现有基于CSM开发的代码定义。CSM框架通过隐形总线传递消息,无需侵入原有代码即可实现远程通讯。
例如,本程序中的AI CSM模块提供了:
Channels: 列出所有的通道Read:读取指定通道的值read all:读取所有通道的值
这些消息可以通过TCP连接发送给本地程序,实现远程控制。
由CSM-TCP-Router通讯层定义,通过指令暴露CSM模块的管理功能,实现远程控制。
List: 列出所有CSM模块List API: 列出指定模块的所有APIList State: 列出指定模块的所有CSM状态Help: 显示模块的帮助文件(存储在CSM VI的Documentation字段)Refresh lvcsm: 刷新缓存文件
代码中内置了一个标准的CSM-TCP-Router客户端,包含一些专属内置指令,这些指令在基于指令集API进行二次开发时无法使用。
Bye: 断开连接Switch:切换模块,便于输入时省略模块名,不带参数时切换回默认模式- TAB键: 自动定位到输入对话框
- 在VIPM中安装本工具及依赖
- 在CSM的范例中打开范例工程CSM-TCP-Router.lvproj
- 启动代码工程中的CSM-TCP-Router(Server).vi
- 启动Client.vi,输入服务器的IP地址和端口号,点击连接
- 输入指令,点击发送,可以在控制台看到返回的消息
- 在Server程序的界面log中,可以看到执行过的历史消息
- 在Client.vi中输入
Bye断开连接 - 关闭Server程序
通过VIPM搜索CSM TCP Router,即可下载安装。
- Communicable State Machine(CSM) - NEVSTOP
- JKI TCP Server - JKI
- Global Stop - NEVSTOP
- OpenG

