第四节:PLC与NCK交互——数据交换的核心机制
做数控系统二次开发,绕不开一个核心问题:PLC怎么跟NCK说话?
说白了,PLC负责逻辑控制,NCK负责轨迹运算。这两兄弟要是配合不好,机床就乱套了。我见过不少工程师,写M代码功能时只盯着PLC程序,结果NCK那边根本没收到信号——嗯,这就是没搞懂数据交换机制。
4.1 数据交换的三种方式
PLC和NCK之间的通信,不是靠什么神秘协议。它们共享一块内存区域,就像两个人共用一块白板。我习惯把这三种方式记成:
- 共享内存区域:最直接的方式,双方都能读写
- 信号映射表:把物理信号映射到逻辑地址
- M代码触发:通过特定代码号触发PLC动作
你想想看,NCK在高速计算插补点时,PLC在监控急停、冷却液、刀库。它们各干各的,但关键时刻必须同步。怎么同步?就是靠这些机制。
4.2 共享内存区域详解
共享内存区域,在西门子840D系统里叫NCK-PLC接口信号区。我当年第一次接触时,被那些地址搞得头晕——DB10、DB21、DB31...后来才明白,其实就是一张地址映射表。
| 区域名称 | 地址范围 | 用途 | 方向 |
|---|---|---|---|
| NCK→PLC | DB10.DBB0~DB10.DBB199 | NCK状态反馈 | NCK写入,PLC读取 |
| PLC→NCK | DB21.DBB0~DB21.DBB199 | PLC控制指令 | PLC写入,NCK读取 |
| M/S/T功能 | DB21.DBB200~DB21.DBB399 | 辅助功能代码 | 双向交互 |
| 用户自定义 | DB31~DB60 | 二次开发专用 | 自由定义 |
举个例子。NCK想告诉PLC「主轴转速到了」,它就在DB10.DBB12的第3位置1。PLC读到这个位,就知道可以执行下一步了。我在项目中遇到过,有人把地址搞反了,结果主轴转了半小时,PLC还在等信号——机床差点报废。
4.3 信号映射表——地址翻译官
信号映射表,说白了就是一张「翻译对照表」。NCK那边叫「主轴正转信号」,PLC这边叫「Q0.0」。没有映射表,你根本不知道谁是谁。
我习惯把映射表分成三类:
- 标准信号:急停、限位、回零——这些是固定的,不用改
- 扩展信号:冷却液、排屑器、照明——可以自定义映射
- 用户信号:完全由开发者定义——这就是二次开发的空间
来看一个实际例子。在FANUC系统中,M代码的触发信号映射是这样的:
// M代码触发信号映射表(FANUC 0i-F)
// 地址格式:G(NCK→PLC), F(PLC→NCK)
M00: G54.0 // 程序停止
M03: G54.1 // 主轴正转
M04: G54.2 // 主轴反转
M05: G54.3 // 主轴停止
M08: G54.4 // 冷却液开
M09: G54.5 // 冷却液关
// 用户自定义M代码(100~199)
M100: G55.0 // 自定义功能1
M101: G55.1 // 自定义功能2
// ... 以此类推
我曾经遇到一个客户,非要让M30(程序结束)同时触发刀库复位。按标准映射,M30只触发G54.7。我只好在PLC里加了一段逻辑:当G54.7为1时,同时置位刀库复位信号。这就是映射表的灵活之处——你可以叠加逻辑。
4.4 M代码触发信号深度分析
M代码是怎么触发PLC动作的?很多人以为就是「NCK发个数字,PLC收到就执行」。其实没那么简单。
完整的流程是这样的:
- NCK读到M代码(比如M08)
- NCK把M08的值写入共享内存的M功能区
- NCK置位「M功能有效」信号
- PLC检测到「M功能有效」信号
- PLC读取M代码值,执行对应逻辑
- PLC执行完毕后,置位「M功能完成」信号
- NCK检测到「M功能完成」,继续执行下一段程序
你看,这是一个握手协议。少了任何一步,机床就会卡住。我调试时最常遇到的问题是:PLC执行完了,但忘了置位「完成」信号。结果NCK一直等,机床就死在那了。
来看一段实际的PLC代码(以西门子STEP 7为例):
// M代码触发处理程序
// 假设M代码值存储在DB21.DBB200
NETWORK 1: 检测M代码有效
A DB21.DBX 0.0 // M功能有效信号
FP M 100.0 // 上升沿检测
S M 100.1 // 设置处理标志
NETWORK 2: 读取M代码值
L DB21.DBB 200 // 读取M代码值
L 8 // 比较M08
==I
S M 100.2 // M08触发标志
NETWORK 3: 执行M08动作(冷却液开)
A M 100.2 // M08触发
S Q 0.4 // 冷却液输出
NETWORK 4: 反馈完成信号
A Q 0.4 // 冷却液已开
S DB21.DBX 0.1 // M功能完成信号
R M 100.1 // 清除处理标志
这段代码看着简单,但坑不少。我强调几个关键点:
- 上升沿检测:必须用FP或上升沿指令,否则PLC每个扫描周期都会触发一次
- 互锁逻辑:M03和M04不能同时为1,必须在PLC里做互锁
- 超时处理:如果PLC超过500ms没返回完成信号,NCK应该报警
4.5 实战中的避坑指南
做了十几年数控系统,我踩过的坑能写一本书。这里挑几个跟数据交换相关的:
- 地址冲突:不同厂家的系统,共享内存地址可能不一样。换系统时一定要重新核对映射表
- 信号抖动:机械触点会有抖动,PLC读到的信号可能不稳定。我习惯加10~20ms的滤波
- 数据溢出:M代码值超过255怎么办?有些系统只支持8位数据。我建议用扩展M代码(M100~M999)
- 时序错乱:NCK和PLC的扫描周期不同步。我一般用「双缓冲」机制——PLC先写缓冲区,NCK在固定时间点读取
我记得有一次,客户反映机床偶尔会「跳步」。查了三天,最后发现是PLC在NCK读取共享内存的瞬间写了新数据。解决方案很简单:在PLC写入前,先检查NCK是否正在读取。这就是所谓的「读写互斥」。
嗯,数据交换这块,说难不难,说简单也不简单。关键是要理解:NCK和PLC是两个独立的系统,它们通过共享内存「握手」通信。你只要把这个模型刻在脑子里,遇到问题就知道从哪下手了。
下一节,我们会深入M代码的二次开发实战。到时候我会带大家写一个完整的自定义M代码功能——从NCK配置到PLC编程,一步不落。