1. 数控系统PLC程序结构认知与最小可运行程序

数控系统PLC程序结构认知与最小可运行程序 学习卡片

任务说明

本案例实现一个最小可运行的数控系统PLC程序,只处理三个信号:急停(EStop)、使能(Enable)、运行(Run)。程序按PLC扫描周期循环执行:读取输入 → 逻辑运算 → 更新输出。当急停未触发且使能有效时,运行输出才允许接通;急停一旦触发,运行输出立即断开。

信号定义与扫描逻辑

  • EStop:急停输入,常闭触点,正常时为1,按下急停为0。
  • Enable:使能输入,操作面板给出,1表示允许运行。
  • Run:运行输出,控制伺服/主轴运行。

逻辑关系:Run = EStop AND Enable。每个扫描周期重新计算一次,保证急停响应不依赖上一周期状态。

读取输入 EStop / Enable 逻辑运算 Run = EStop AND Enable 更新输出 Run 线圈 下一扫描周期 扫描周期:输入采样 → 程序执行 → 输出刷新,循环往复 急停信号在任一周期被采样为0,Run 立即断开

完整代码(C语言模拟PLC扫描)

#include <stdio.h>
#include <stdbool.h>

/* 输入信号 */
typedef struct {
    bool EStop;   /* 急停:常闭,正常=1,按下=0 */
    bool Enable;  /* 使能:1=允许运行 */
} PLC_Input;

/* 输出信号 */
typedef struct {
    bool Run;     /* 运行输出 */
} PLC_Output;

/* 一个扫描周期的核心逻辑 */
void plc_scan(const PLC_Input *in, PLC_Output *out) {
    /* 急停未触发 且 使能有效,才允许运行 */
    out->Run = in->EStop && in->Enable;
}

int main(void) {
    PLC_Input in;
    PLC_Output out = { false };

    /* 场景1:急停正常、使能有效 → 运行接通 */
    in.EStop = true; in.Enable = true;
    plc_scan(&in, &out);
    printf("场景1 EStop=%d Enable=%d -> Run=%d\n", in.EStop, in.Enable, out.Run);

    /* 场景2:急停触发 → 运行断开 */
    in.EStop = false; in.Enable = true;
    plc_scan(&in, &out);
    printf("场景2 EStop=%d Enable=%d -> Run=%d\n", in.EStop, in.Enable, out.Run);

    /* 场景3:使能无效 → 运行断开 */
    in.EStop = true; in.Enable = false;
    plc_scan(&in, &out);
    printf("场景3 EStop=%d Enable=%d -> Run=%d\n", in.EStop, in.Enable, out.Run);

    return 0;
}

编译与运行

gcc plc_min.c -o plc_min
./plc_min

验证方法与通过条件

运行后观察三行输出,与逻辑 Run = EStop AND Enable 一致即通过:

  • 场景1:EStop=1 Enable=1 → Run=1
  • 场景2:EStop=0 Enable=1 → Run=0
  • 场景3:EStop=1 Enable=0 → Run=0

若将 plc_scan 放入 while(1) 循环并周期性更新输入,即对应真实PLC的循环扫描行为;急停断开到Run输出为0的延迟不超过一个扫描周期。