nscada 采集软件完整教程:从建设备到看数据
这篇教程带你走通 nscada 的完整闭环:装软件 → 建设备 → 配点位 → 建采集任务 → 看数据/转发。后半部分重点给出西门子 S7、Modbus TCP/RTU、RS-485 串口仪表三种场景下的真实点位示例,照着填就能跑。
一、先选一种打开方式
| 场景 | 打开方式 |
|---|---|
| 快速体验 | 在线 Demo:http://nscada.cn:3000 |
| 工程师本机 | 桌面客户端(Windows / macOS)双击即用 |
| 长期采集 | 服务端部署在 Windows / Linux / ARM 盒子,systemd/NSSM 常驻 |
二、四步闭环流程
- 建设备:选通道类型(S7 / Modbus TCP / Modbus RTU / 通用串口),填连接参数,点“测试连接”;
- 配点位:把要读的寄存器/变量地址写成点表(本文第三节给出三种协议示例);
- 建任务:设周期(如 1s)或 cron,启动采集;
- 看结果:运行监控页看“在线”与落库行数;配转发通道把数据推到 HTTP/MQTT。
三、点位(Tag)是什么
点位 = “一个要读的变量”。关键字段:
| 字段 | 含义 |
|---|---|
| code | 点号,如 TEMP1,同一设备内唯一 |
| addrExpr | 地址表达式:协议不同写法不同(见下表) |
| dataType | bool / int16 / uint16 / int32 / uint32 / float32 / float64 |
| scaleA / scaleB | 线性换算 value = scaleA × 原始值 + scaleB |
| precision / unit | 小数位 / 单位(℃、MPa、rpm…) |
| storeMode | always 全量;on-change + deadband 只在变化超过死区时存 |
几十上百个点位建议用 Web 点表页的“下载模板 → 填表 → 导入 CSV”,一次建完。
四、不同协议的点位示例(重点)
4.1 西门子 S7(含 S7-1200/1500)
前置:TIA 勾选“允许远程伙伴(PUT/GET)访问”,DB 取消“优化的块访问”;S7-1200/1500 槽位一般 rack0/slot1。
| code | addrExpr | dataType | 说明 |
|---|---|---|---|
| TEMP1 | DB1,REAL0 | float32 | DB1 首 4 字节工艺值 |
| PRESS | DB1,REAL8 | float32 | 相隔 4 字节的另一个浮点 |
| RUN | DB1,X14.0 | bool | DB1.DBX14.0 运行位 |
| FAULT | DB1,X14.1 | bool | DB1.DBX14.1 故障位 |
| COUNT | DB1,INT20 | int16 | DB1.DBW20 产量 |
| ARR_V | DB1,INT30.8 | int16 | DB1 第 30 字节起 8 个 INT(数组) |
| M_SPEED | MD40 | float32 | 标记区双字浮点 |
| CNT32 | DB3,DINT0 | int32 | 32 位有符号整数(DInt/DBD0) |
| I_RUN | I0.1 | bool | 输入位(按钮等) |
| Q_LAMP | Q2.3 | bool | 输出位(灯/阀) |
注意:INT 是 16 位(2 字节,对应 DBW0),DInt 是 32 位(4 字节,对应 DBD0)。地址里的类型词必须与 PLC 变量类型一致,否则读不到或读错。
提示:同一 DB 连续地址会自动合并为区块读取,点位别乱排影响不大,引擎会按偏移切片。
4.2 Modbus TCP / RTU(电表/变频器等)
地址 0 基。HR=保持寄存器(03),IR=输入寄存器(04),COIL=线圈(01),DISCRETE=离散输入(02)。注意 float32 占 2 个寄存器、float64 占 4 个。
| code | addrExpr | dataType | 含义(示例电表) |
|---|---|---|---|
| VOLT | HR:0 | float32 | A 相电压 |
| CURR | HR:2 | float32 | A 相电流 |
| POWER | HR:4 | float32 | 总有功功率 |
| KWH | HR:8 | float64 | 正向电量(4 寄存器) |
| FREQ | HR:16 | uint16 | 频率 ×100 |
| SW_ON | COIL:0 | bool | 合闸状态 |
| DI1 | DISCRETE:3 | bool | 开关量输入 3 |
数值不对先查两处:寄存器是不是 1 基(显示 40001 → 协议 0 基写 HR:0);以及浮点高低字顺序(连接参数里 wordOrder big/little)。
4.3 通用串口 RS-232/485 仪表(自定义协议)
先配“读指令”(请求帧 HEX + 校验方式),点位再按“指令代号:响应内字节偏移”引用。以某称重仪表为例,发送 01 03 00 00 00 02 + CRC16 后返回 4 字节重量:
| 读指令 | code | addrExpr | dataType | 含义 |
|---|---|---|---|---|
| R1 = 01 03 00 00 00 02 (crc16-modbus) | WEIGHT | R1:0 | float32 | 净重 kg |
| 同上 | STABLE | R1:4 | bool | 稳定位(第 5 字节) |
| UNIT | R1:5 | uint16 | 单位码 |
串口连接参数要点:波特率/数据位/停止位/校验与仪表一致;一帧边界按“静默窗口”切分;同一串口多台设备时引擎自动串行请求。
五、缩放与单位示例
例如 0~4095 对应 0~1.0MPa 的压力:
scaleA = (1.0 - 0)/(4095 - 0) ≈ 0.0002442
scaleB = 0
precision = 3,unit = MPa
又比如温度 4–20mA 电流环读数为 400~2000,对应 -10~50℃:
scaleA = (50-(-10))/(2000-400) = 0.0375
scaleB = -10 - 0.0375×400 = -25
六、采集任务与存储建议
- 关键快变量:1s;趋势量:10~30s;整点抄表:cron(如
0 * * * *); - 稳态信号(温度、开关量常值)用 on-change + 死区,大幅减少存储量;
- 多设备同时启动可用“错峰”打散请求,避免同一瞬间并发打满。
七、验证与转发
采集正常后:运行监控页应显示“在线”、落库行数增长;转发页 pending≈0、sent 增长。若转发为 0,依次检查:转发通道 enabled、设备过滤是否含该设备、目标地址/broker 可达。
八、常见问题速查
| 现象 | 处理 |
|---|---|
| 测试连接失败 | IP/端口、网段、PLC PUT/GET、S7 槽位;串口是否被占用 |
| 连接成功但某点读不到 | 地址/类型是否匹配(float32 2 寄存器);S7 DB 是否优化块 |
| 读到了但数值不对 | 0 基 vs 1 基、字节序/字序、scale 是否要换算 |
| 转发 0 | 转发通道/设备过滤/目标可达;看 dead 与日志 |
