3. LinuxCNC状态反馈至PLC
任务说明
本案例实现LinuxCNC将自身运行状态(空闲、运行、报警)通过数字输出信号反馈给PLC。LinuxCNC作为从站,PLC通过读取数字输入点获取状态。状态映射:空闲=00(无信号),运行=01(OUT0导通),报警=10(OUT1导通)。
硬件与前置条件
- LinuxCNC安装有
halcmd命令行工具,并已配置好运动控制(如POSIX或TRIVKINS类型) - PLC数字输入模块支持24V直流电平,与LinuxCNC输出接口电平匹配
- LinuxCNC的并行端口或扩展板卡(如MESA 5i25)已正确加载,且输出引脚已映射到物理端子
实现方案
使用LinuxCNC的HAL层逻辑:通过halui组件读取运动状态信号,经logic组件(或and2/not组合)编码为两位二进制信号,最终连接到数字输出引脚。状态判定依据:halui.motion.0.is-idle为真表示空闲;halui.motion.0.is-running为真表示运行;halui.motion.0.is-alarm为真表示报警。三者互斥,但报警优先级最高。
关键完整代码
创建文件state_to_plc.hal,内容如下:
# 加载halui组件(若未在主配置中加载)
loadrt halui
# 加载逻辑门组件
loadrt and2
loadrt not
# 创建两位输出编码:OUT0=运行,OUT1=报警
# 空闲状态由两者均为0表示,无需额外信号
# 运行状态编码:OUT0 = is-running
newsig run_out bit
newsig alarm_out bit
# 连接halui状态信号到中间信号
linksp halui.motion.0.is-running run_out
linksp halui.motion.0.is-alarm alarm_out
# 将中间信号连接到物理输出引脚(以并行端口为例)
# 假设OUT0连接pin0,OUT1连接pin1
setp parport.0.pin-00-out-invert 0
setp parport.0.pin-01-out-invert 0
# 将信号连接到输出引脚
net run_out => parport.0.pin-00-out
net alarm_out => parport.0.pin-01-out
# 报警时同时拉高OUT0,形成10编码(可选,若PLC需区分报警与空闲)
# 若采用00=空闲、01=运行、10=报警,则报警时OUT0应为0,OUT1为1
# 上述连接已满足:报警时alarm_out=1,run_out=0,即10编码
# 启动实时线程(若尚未启动)
start
运行与加载
- 将上述文件放入LinuxCNC配置目录(如
~/linuxcnc/configs/my_mill/) - 在
.hal主文件中追加一行:source state_to_plc.hal,或手动在终端执行:halcmd -f state_to_plc.hal - 启动LinuxCNC(如
linuxcnc my_mill.ini)
验证方法
- 空闲状态:LinuxCNC启动后未执行任何MDI命令,用万用表测量OUT0与OUT1对地电压,两者均应为0V(或低电平)
- 运行状态:在MDI中输入
G0 X10并执行,此时OUT0应为高电平(如5V或24V),OUT1为低电平 - 报警状态:触发急停(E-Stop)或输入超程报警,OUT1应为高电平,OUT0为低电平
- PLC侧验证:将OUT0接入PLC输入点I0.0,OUT1接入I0.1,PLC程序中读取字节:值为0=空闲,1=运行,2=报警
常见问题
- 输出无变化:检查
parport是否加载且端口地址正确,用halcmd show pin parport.0.pin-00-out查看当前值 - 报警信号不触发:确认
halui.motion.0.is-alarm信号在急停时确实为真,可用halcmd getp halui.motion.0.is-alarm实时查询 - 编码冲突:若PLC需区分“急停”与“普通报警”,可增加第三个输出位,本案例仅覆盖基本三态
通过上述配置,PLC无需了解LinuxCNC内部协议,仅通过两个数字输入点即可获取核心运行状态,满足机床远程监控或安全联锁的基本需求。