# PLSR Modbus通信协议 > 协议版本:V1.0 > 地址表修订:R5 > 目标平台:XDM-60T4-E > 对标依据:[信捷XD/XL系列PLC定位控制手册](./信捷XD_XL系列PLC定位控制手册_PD02_20260510_V1.3.pdf) > 对应需求:[PLSR需求规格统计.md](./PLSR需求规格统计.md) > > R5变更:取消Modbus通信历史区;S0、S1改为在1000~9199数据池中运行时指定首地址 > 的动态数据块;其余PLSR参数和状态固定映射到Modbus保持寄存器。取消固定S0槽和 > 每轴内嵌S1数据。 > R4变更:已定义固定字段的PLSR地址标记为已占用;仅未定义字段的扩展区保持保留。 > R3变更:区分工程已占用地址和PLSR推荐预留地址。 > R2变更:区分可选操作数、固定相对布局和信捷固定软元件地址;增加Y0~Y3公共参数、 > K0~K4参数组及运行状态地址与本项目Modbus字段的逐项对应表。 ## 1. 地址和数据约定 ### 1.1 地址表示 本文所有地址均为Modbus PDU中的**零基地址**。例如: | 本文地址 | 传统4xxxx写法 | |---:|---:| | 200 | 40201 | | 5160 | 45161 | 上位机如果使用“地址从1开始”显示,应在本文地址基础上加1。代码、报文和测试用例 统一使用本文零基地址,禁止直接把`40201`作为PDU地址发送。 ### 1.2 字节序和字序 - 单个16位寄存器使用Modbus大端字节序。 - 32位数据占两个寄存器,高16位在前、低16位在后。 - 64位数据占四个寄存器,从最高16位到最低16位依次排列。 - 有符号数采用二进制补码。 - 写入32位或64位命令参数时必须使用功能码`0x10`一次写完,禁止拆成多个`0x06`后立即触发。 示例:32位数`0x12345678`从地址A开始保存为: ```text A+0 = 0x1234 A+1 = 0x5678 ``` ### 1.3 访问权限 | 标记 | 含义 | |---|---| | RO | 只读,主站写入应返回非法数据地址或非法数据值 | | RW-S | 影子参数可读写,COMMIT成功后才进入运行配置 | | RW-L | 运行时可读写,按字段定义立即或在控制周期内生效 | | WO-T | 只写触发字段;写入后产生一次命令处理 | | RES | 保留,读回0,写入拒绝 | 当前工程的通用Modbus数组尚未实施字段级读写权限。接入PLSR时必须增加地址权限校验, 不能仅依赖文档约束上位机。 ### 1.4 原子提交规则 1. 每轴保存S0、S1动态数据块首地址;S2、D和公共参数使用固定地址影子区。 2. 主站写完某轴配置后,发送`COMMIT_AXIS`命令。 3. 从站完整检查段数、输出冲突、频率、跳转、限位和参数范围。 4. 校验成功后原子复制到该轴运行配置,并更新`ACTIVE_GENERATION`。 5. 校验失败时运行配置保持不变,返回错误码和错误数据块号。 6. 已启动任务不受后续影子参数写入影响;运行中调频使用`SET_TARGET_FREQUENCY`命令。 7. COMMIT成功后轴使用S0、S1、S2和D的私有不可变运行快照;修改原动态数据块不得 影响已经提交或已经启动的任务。 ### 1.5 信捷地址与本项目地址的关系 本协议区分三类地址,不得混为一谈: 1. **可选操作数地址**:信捷PLSR的S0、S1由用户在指令中指定。本项目用每轴固定的 `S0_BASE_ADDRESS`和`S1_BASE_ADDRESS`保存其运行时首地址;S0、S1数据本身不固定。 D在本项目中选择Q输出点,S2通过`SELECTED_S2`选择K0~K4。 2. **固定相对偏移**:S0头部、每段10字、S1两个双字以及S2套组内部字段的相对 布局固定。本项目保持这些功能布局。 3. **固定绝对软元件地址**:信捷为Y0~Y3固定分配SFD、HSD、SD和SM地址。本项目不把 这些编号直接作为Modbus PDU地址,而是在第4章提供确定的一一对应关系。 因此,“对标信捷固定地址”表示每个信捷字段都能唯一映射到本项目字段并保持等效语义, 不表示主站可以把`SFD900`直接当作Modbus地址900访问。若后续需要兼容信捷软元件编号, 应增加独立的地址转换层;已经实施并冻结的Modbus PDU地址不得直接改义。 ## 2. 现有占用和推荐预留方案 工程标准Modbus保持寄存器范围为0~9999。下表中的数值全部是**本项目Modbus PDU 零基地址**,不是信捷SFD、HSD或SD软元件编号。信捷不同类型的软元件拥有彼此独立的 编号空间,例如SFD和SD可以出现相同编号,不能直接合并到一个Modbus保持寄存器空间。 当前占用情况及推荐预留方案如下: | Modbus保持寄存器范围 | 数量 | 当前状态 | 推荐用途 | 信捷PLSR对应关系 | 所有者/建议使用者 | |---:|---:|---|---|---|---| | 0~199 | 79 | 保留 | 无 | 无 | 待定 | | 200~255 | 56 | 保留 | PLSR全局信息、命令和应答 | 指令调用与诊断增强;信捷无同地址区 | PLSR | | 256~895 | 640 | 已占用 | 四轴S0/S1基址、D、S2和实时状态 | S0/S1为动态操作数;其余对应Y0~Y3固定参数和状态,详见4.1~4.4 | PLSR | | 896~999 | 104 | 保留 | 推荐作为PLSR动态数据块描述符或近期扩展区 | 无固定信捷地址 | 待定 | | 1000~9199 | 8200 | 已占用 | S0/S1动态数据池,运行时指定各数据块首地址 | 对应信捷可动态指定首地址的S0和S1数据块 | PLSR | | 9200~9999 | 800 | 保留 | 推荐用于PLSR后续扩展或事件历史,也可在地址冻结前另行分配 | 无 | 待定 | 标为“已占用”的范围已经确定具体字段或数据结构,其他模块不得覆盖,即使对应代码尚未 全部实现,也应视为地址协议已经占位。标为“保留”的范围没有确定字段,推荐用途不构成 占用;正式分配前仍可调整,但必须更新本地址表修订号并完成全工程冲突检查。 本表规定“已确定的数据放在本项目哪个Modbus地址”;第4章解决“该字段对应信捷哪个固定 软元件地址”。两张表必须结合使用。V1.0不提供把`SFD900`直接解释为PDU地址900的 物理地址兼容模式。 ## 3. 全局信息、命令和应答:200~255 | 地址 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | 200 | PROTOCOL_MAGIC_0 | U16 | RO | 固定`0x504C`,ASCII `PL` | | 201 | PROTOCOL_MAGIC_1 | U16 | RO | 固定`0x5352`,ASCII `SR` | | 202 | PROTOCOL_VERSION_MAJOR | U16 | RO | 主版本,V1为1 | | 203 | PROTOCOL_VERSION_MINOR | U16 | RO | 次版本 | | 204 | ADDRESS_MAP_REVISION | U16 | RO | 地址表修订R5为5 | | 205 | AXIS_COUNT | U16 | RO | 固定4 | | 206 | MAX_SEGMENTS | U16 | RO | 固定100 | | 207 | CAPABILITY_FLAGS | U16 | RO | 能力标志,见3.1 | | 208~209 | GUARANTEED_MAX_HZ | U32 | RO | 100000 | | 210~211 | EXTENDED_MAX_HZ | U32 | RO | 200000,非保证扩展区 | | 212 | REFRESH_CAPABILITIES | U16 | RO | bit0=1 ms,bit1=0.1 ms | | 213 | GLOBAL_STATUS | U16 | RO | 全局状态标志 | | 214~215 | RESERVED | - | RES | 保留 | | 216 | CMD_CODE | U16 | RW-L | 命令码,见3.2 | | 217 | CMD_AXIS | U16 | RW-L | 0~3;`0xFFFF`表示允许的全轴命令 | | 218 | CMD_FLAGS | U16 | RW-L | 命令选项 | | 219 | CMD_RESERVED | - | RES | 保留 | | 220~223 | CMD_ARG0 | U64/I64 | RW-L | 命令参数0 | | 224~227 | CMD_ARG1 | U64/I64 | RW-L | 命令参数1 | | 228~229 | CMD_ARG2 | U32/I32 | RW-L | 命令参数2 | | 230 | CMD_PAYLOAD_GENERATION | U16 | RW-L | 期望使用的影子参数代号 | | 231 | CMD_SEQUENCE | U16 | WO-T | **最后写入**;新序号触发一次命令 | | 232 | ACK_SEQUENCE | U16 | RO | 最近处理完成的命令序号 | | 233 | CMD_RESULT | U16 | RO | 处理结果,见3.3 | | 234 | CMD_ERROR_CODE | U16 | RO | 错误码 | | 235 | CMD_ERROR_DETAIL | U16 | RO | 错误字段或数据块号 | | 236~239 | ACK_DATA | U64 | RO | 命令返回数据 | | 240 | GLOBAL_SHADOW_GENERATION | U16 | RO | 最近收到的全局影子代号 | | 241 | GLOBAL_ACTIVE_GENERATION | U16 | RO | 已生效的全局配置代号 | | 242 | LAST_EVENT_SEQUENCE | U16 | RO | 全局最近事件序号 | | 243 | LAST_EVENT_AXIS | U16 | RO | 最近事件轴号 | | 244 | LAST_EVENT_SEGMENT | U16 | RO | 最近事件段号,1~100 | | 245 | LAST_EVENT_REASON | U16 | RO | 最近事件原因 | | 246 | SELF_TEST_STATUS | U16 | RO | 自测状态 | | 247 | SELF_TEST_ERROR | U16 | RO | 自测错误 | | 248~255 | RESERVED | - | RES | 保留 | ### 3.1 CAPABILITY_FLAGS | 位 | 含义 | |---:|---| | 0 | PULSE/DIR | | 1 | AB相x4计数 | | 2 | 四轴独立运行 | | 3 | 100段路径 | | 4 | 相对定位 | | 5 | 绝对定位 | | 6 | 软限位 | | 7 | 齿隙补偿 | | 8 | FOLLOW参数 | | 9 | 工程单位换算 | | 10 | 0.1 ms刷新 | | 11 | Backup SRAM检查点 | | 12 | 命令序号防重 | | 13~15 | 保留 | ### 3.2 CMD_CODE | 值 | 命令 | CMD_ARG0 | 说明 | |---:|---|---|---| | 0 | NOP | - | 不执行 | | 1 | COMMIT_AXIS | - | 校验指定轴的S0/S1动态块及S2/D固定参数,并创建运行快照 | | 2 | START | - | 异步启动指定轴 | | 3 | STOP_DECEL | - | 指定轴减速停止;轴`0xFFFF`表示全部轴 | | 4 | STOP_IMMEDIATE | - | 指定轴立即停止;轴`0xFFFF`表示全部轴 | | 5 | PAUSE | - | 减速暂停 | | 6 | RESUME | - | 继续暂停任务 | | 7 | SET_POSITION | I64位置 | 设置逻辑当前位置并置`position_valid` | | 8 | CLEAR_POSITION | - | 当前位置清零并置有效 | | 9 | CLEAR_TOTAL | - | 清零累计输出脉冲 | | 10 | SAVE_CONFIG | - | 固定配置保存到Flash | | 11 | LOAD_CONFIG | - | 加载已保存固定配置,不自动启动 | | 12 | RESET_ERROR | - | 清除可恢复错误 | | 13 | SELF_TEST | 测试掩码 | 执行内部自测 | | 14 | SET_TARGET_FREQUENCY | U32频率 | 运行中调频,在S2刷新周期内开始生效 | | 15 | CLEAR_EVENT | - | 确认并清除最近事件锁存 | ### 3.3 CMD_RESULT | 值 | 名称 | 含义 | |---:|---|---| | 0 | IDLE | 尚未处理命令 | | 1 | ACCEPTED | 已接受,异步执行中 | | 2 | SUCCESS | 执行成功 | | 3 | REJECTED | 命令被拒绝,查看错误码 | | 4 | DUPLICATE | 相同序号,未重复执行并返回上次结果 | `CMD_SEQUENCE`为16位循环序号。主站发送新命令时递增,通信重试必须保持原序号。 从站缓存最近序号及完整结果;相同序号不得再次产生运动。 ## 4. 每轴固定块:256~895 每轴占160个保持寄存器: ```text AXIS_BASE(axis) = 256 + axis × 160,axis取0~3 ``` | 轴 | AXIS_BASE | 范围 | |---:|---:|---:| | 0 | 256 | 256~415 | | 1 | 416 | 416~575 | | 2 | 576 | 576~735 | | 3 | 736 | 736~895 | ### 4.1 信捷固定地址逐轴对应 下表给出信捷Y0~Y3固定软元件区与本项目轴块的唯一对应关系。信捷使用Y点名称, 本项目板级输出使用Q点名称;表中的Y0~Y3表示信捷对标轴序号,不等于本项目Q点编码。 | 本项目轴 | 信捷脉冲轴D | 本项目轴块 | 信捷公共参数 | 信捷K0动态参数 | 信捷K1 | 信捷K2 | 信捷K3 | 信捷K4 | |---:|---|---:|---|---|---|---|---|---| | 0 | Y0 | 256~415 | SFD900~943 | HSD460~479 | SFD950~969 | SFD970~989 | SFD990~1009 | SFD1010~1029 | | 1 | Y1 | 416~575 | SFD1030~1073 | HSD480~499 | SFD1080~1099 | SFD1100~1119 | SFD1120~1139 | SFD1140~1159 | | 2 | Y2 | 576~735 | SFD1160~1203 | HSD500~519 | SFD1210~1229 | SFD1230~1249 | SFD1250~1269 | SFD1270~1289 | | 3 | Y3 | 736~895 | SFD1290~1333 | HSD520~539 | SFD1340~1359 | SFD1360~1379 | SFD1380~1399 | SFD1400~1419 | 信捷固定运行状态地址与本项目实时状态区对应如下: | 本项目轴 | 信捷运行标志 | 信捷方向标志 | 信捷实时SD区 | 信捷累计脉冲 | 本项目实时状态区 | |---:|---|---|---|---|---:| | 0 | SM1000 | SM1001 | SD1000~1011 | HSD0~1 | 384~415 | | 1 | SM1020 | SM1021 | SD1020~1031 | HSD4~5 | 544~575 | | 2 | SM1040 | SM1041 | SD1040~1051 | HSD8~9 | 704~735 | | 3 | SM1060 | SM1061 | SD1060~1071 | HSD12~13 | 864~895 | 信捷段事件中断号固定为Y0对应`I6000~I6099`、Y1对应`I6100~I6199`、Y2对应 `I6200~I6299`、Y3对应`I6300~I6399`。本项目不复用PLC中断号,而通过 `SEGMENT_EVENT_SEQUENCE`、`SEGMENT_EVENT_NUMBER`和`SEGMENT_EVENT_REASON`发布等效事件。 常用起始地址速查: | 轴 | S0/S1动态基址配置 | D/公共参数 | S2-K0 | 实时状态 | |---:|---:|---:|---:|---:| | 0 | 256 | 272 | 304 | 384 | | 1 | 416 | 432 | 464 | 544 | | 2 | 576 | 592 | 624 | 704 | | 3 | 736 | 752 | 784 | 864 | ### 4.2 S0/S1动态基址和选择信息:AXIS_BASE+0~15 | 偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +0 | S0_BASE_ADDRESS | U16 | RW-S | S0数据块在1000~9199动态池中的零基首地址 | | +1 | S0_WORD_COUNT | U16 | RW-S | S0实际占用字数,必须等于`10+段数×10` | | +2 | S1_BASE_ADDRESS | U16 | RW-S | S1数据块在1000~9199动态池中的零基首地址 | | +3 | SELECTED_S2 | U16 | RW-S | 选择固定参数套组K0~K4,取值0~4 | | +4 | AXIS_SHADOW_GENERATION | U16 | RW-S | 主站写完S0、S1和轴参数后最后递增 | | +5 | AXIS_ACTIVE_GENERATION | U16 | RO | 最近成功COMMIT的代号 | | +6 | AXIS_CONFIG_STATUS | U16 | RO | bit0影子完整,bit1活动配置有效,bit2影子已修改 | | +7 | EXPECTED_S0_CRC16 | U16 | RW-S | COMMIT时核对S0数据块CRC16,防止写入中途启动 | | +8 | EXPECTED_S1_CRC16 | U16 | RW-S | COMMIT时核对S1的4个字 | | +9 | OPERAND_FLAGS | U16 | RW-S | 当前必须为0,保留动态数据块属性扩展 | | +10 | ACTIVE_S0_BASE_ADDRESS | U16 | RO | 最近成功COMMIT快照的S0来源首地址 | | +11 | ACTIVE_S1_BASE_ADDRESS | U16 | RO | 最近成功COMMIT快照的S1来源首地址 | | +12~+15 | RESERVED | - | RES | 保留 | `AXIS_BASE+0~15`只保存操作数地址、固定参数组选择和原子提交信息,不保存S0、S1 数据本体。S0和S1可以被不同轴共享;COMMIT后各轴使用私有快照,后续改写动态数据池 不会改变已提交任务。S0和S1数据块不得重叠,活动写入也不得破坏其他轴正在提交的数据。 ### 4.3 D及脉冲公共参数:AXIS_BASE+16~47 | 偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +16 | D_PULSE_A_POINT | U16 | RW-S | PULSE点或AB的A点,点编码见4.6 | | +17 | D_DIR_B_POINT | U16 | RW-S | DIR点或AB的B点 | | +18 | D_OUTPUT_MODE | U16 | RW-S | 0=PULSE/DIR,1=AB相 | | +19 | PULSE_OUTPUT_POLARITY | U16 | RW-S | 0正常,1反相 | | +20 | DIRECTION_POLARITY | U16 | RW-S | 0正逻辑,1负逻辑 | | +21 | COUNT_EDGE | U16 | RO | PULSE/DIR固定0=物理上升沿;AB固定4=x4 | | +22 | DIRECTION_DELAY_MS | U16 | RW-S | 默认10 ms | | +23 | PULSE_UNIT | U16 | RW-S | 单位编码见4.5 | | +24~+25 | PULSES_PER_REV | U32 | RW-S | 每转指令脉冲数,必须非0 | | +26~+27 | MOVE_UNITS_PER_REV | U32 | RW-S | 每转移动量,单位为所选工程单位,必须非0 | | +28 | SEGMENT_SEND_MODE | U16 | RW-S | 0完成方式,1后续方式 | | +29 | SOFT_LIMIT_ENABLE | U16 | RW-S | 0关闭,1启用 | | +30 | POS_LIMIT_INPUT | U16 | RW-S | 正限位输入点编码,`0xFFFF`无输入 | | +31 | NEG_LIMIT_INPUT | U16 | RW-S | 负限位输入点编码,`0xFFFF`无输入 | | +32 | LIMIT_INPUT_POLARITY | U16 | RW-S | bit0正限位、bit1负限位;0常开,1常闭 | | +33 | COMMON_FLAGS | U16 | RW-S | 保留扩展标志,当前必须写0 | | +34~+35 | SOFT_POSITIVE_LIMIT | I32 | RW-S | 正软限位逻辑坐标 | | +36~+37 | SOFT_NEGATIVE_LIMIT | I32 | RW-S | 负软限位逻辑坐标 | | +38~+39 | BACKLASH_POSITIVE | U32 | RW-S | 正向齿隙补偿量 | | +40~+41 | BACKLASH_NEGATIVE | U32 | RW-S | 反向齿隙补偿量 | | +42~+43 | ELECTRICAL_ORIGIN | I32 | RW-S | 电气原点位置 | | +44 | AB_COUNT_MODE | U16 | RO | 固定4,表示x4边沿计数 | | +45 | OUTPUT_RESOURCE_FLAGS | U16 | RO | 输出能力和占用状态 | | +46~+47 | RESERVED | - | RES | 保留 | 信捷公共参数地址设为`B`:Y0/Y1/Y2/Y3的`B`分别为SFD900/SFD1030/SFD1160/SFD1290。 本项目公共字段按下表与信捷固定地址对应;无直接对应项属于本项目增强字段。 | 本项目偏移 | 本项目字段 | 信捷固定地址/字段 | |---:|---|---| | +16 | D_PULSE_A_POINT | PLSR的D操作数(Y0~Y3),不是SFD参数 | | +17 | D_DIR_B_POINT | B+6,脉冲方向端子 | | +18 | D_OUTPUT_MODE | B+0中的脉冲输出类型/AB相配置 | | +19 | PULSE_OUTPUT_POLARITY | B+0中的脉冲输出逻辑 | | +20 | DIRECTION_POLARITY | B+0中的方向逻辑 | | +21、+44 | COUNT_EDGE、AB_COUNT_MODE | 本项目固定语义,信捷无独立参数地址 | | +22 | DIRECTION_DELAY_MS | B+7 | | +23 | PULSE_UNIT | B+0中的脉冲单位字段 | | +24~+25 | PULSES_PER_REV | B+2~B+3 | | +26~+27 | MOVE_UNITS_PER_REV | B+4~B+5 | | +28 | SEGMENT_SEND_MODE | B+1 | | +29 | SOFT_LIMIT_ENABLE | B+0中的软限位使能位 | | +30~+31 | POS/NEG_LIMIT_INPUT | B+15的高、低字节 | | +32 | LIMIT_INPUT_POLARITY | B+12中的限位端子极性位 | | +34~+35 | SOFT_POSITIVE_LIMIT | B+20~B+21 | | +36~+37 | SOFT_NEGATIVE_LIMIT | B+22~B+23 | | +38~+39 | BACKLASH_POSITIVE | B+8 | | +40~+41 | BACKLASH_NEGATIVE | B+9 | | +42~+43 | ELECTRICAL_ORIGIN | B+10~B+11 | | +45 | OUTPUT_RESOURCE_FLAGS | 本项目资源冲突检查增强字段 | ### 4.4 S2参数套组:AXIS_BASE+48~127 每轴有5套S2,每套16个寄存器: ```text S2_BASE(axis, set) = AXIS_BASE(axis) + 48 + set × 16 set取0~4 ``` | 相对S2偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +0~+1 | DEFAULT_FREQUENCY_HZ | U32 | RW-S | 段频率为0时使用,同时定义加减速斜率基准 | | +2 | ACCEL_TIME_MS | U16 | RW-S | 默认速度对应的加速时间,0表示无加速 | | +3 | DECEL_TIME_MS | U16 | RW-S | 默认速度对应的减速时间,0表示无减速 | | +4 | BACKLASH_TIME_MS | U16 | RW-S | 齿隙补偿加减速时间 | | +5 | CURVE_MODE | U16 | RW-S | 0直线,1=S形,2=正弦,3保留 | | +6~+7 | MAX_FREQUENCY_HZ | U32 | RW-S | 最高速度限制 | | +8~+9 | START_FREQUENCY_HZ | U32 | RW-S | 任务起始速度 | | +10~+11 | END_FREQUENCY_HZ | U32 | RW-S | 任务终止速度 | | +12 | FOLLOW_PERFORMANCE | U16 | RW-S | 1~100 | | +13 | FOLLOW_FEEDFORWARD | U16 | RW-S | 0~100% | | +14 | REFRESH_PERIOD | U16 | RW-S | 0=1 ms,1=0.1 ms | | +15 | RESERVED | - | RES | 保留 | S2第0套保存在Backup SRAM动态区,第1~4套属于固定配置并由`SAVE_CONFIG`保存到Flash。 信捷每套S2参数也采用20个软元件的固定步长,其中PLSR字段使用`P+0~P+14`, `P+15`保留,`P+16~P+19`为ZRN参数。本项目只映射PLSR所需的前16个寄存器: | 本项目S2偏移 | 信捷参数组偏移 | 含义 | |---:|---:|---| | +0~+1 | P+0~P+1 | 默认速度/频率 | | +2 | P+2 | 加速时间 | | +3 | P+3 | 减速时间 | | +4 | P+4 | 补间/补偿加减速时间 | | +5 | P+5 | 脉冲加减速模式 | | +6~+7 | P+6~P+7 | 最高速度 | | +8~+9 | P+8~P+9 | 起始速度 | | +10~+11 | P+10~P+11 | 终止速度 | | +12 | P+12 | FOLLOW性能参数 | | +13 | P+13 | FOLLOW前馈补偿参数 | | +14 | P+14 | 脉冲频率刷新时间 | | +15 | P+15 | 保留 | ### 4.5 PULSE_UNIT编码 编码与信捷配置语义对应: | 值 | 单位 | |---:|---| | 0 | 脉冲个数/Hz | | 1 | 1 μm | | 3 | 0.01 mm | | 5 | 0.1 mm | | 7 | 1 mm | ### 4.6 Q点和I点编码 PLC点名采用八进制风格编号,寄存器中使用连续逻辑ID,避免把Q10误解成十进制第10点: | ID | 输出点 | MCU | ID | 输出点 | MCU | |---:|---|---|---:|---|---| | 0 | Q0 | PF6 | 9 | Q11 | PG6 | | 1 | Q1 | PF8 | 10 | Q12 | PH9 | | 2 | Q2 | PF7 | 11 | Q13 | PH8 | | 3 | Q3 | PF9 | 12 | Q14 | PH7 | | 4 | Q4 | PI8 | 13 | Q15 | PH6 | | 5 | Q5 | PE6 | 14 | Q16 | PF11 | | 6 | Q6 | PE5 | 15 | Q17 | PB0 | | 7 | Q7 | PE4 | 16 | Q20 | PH5 | | 8 | Q10 | PG7 | 65535 | 无输出点 | - | 输入点采用相同连续ID规则:I0~I7对应0~7,I10~I17对应8~15,I20对应16, `0xFFFF`表示无输入点。具体MCU引脚由板型适配表定义。 ### 4.7 实时状态:AXIS_BASE+128~159 状态读取应采用快照:从站更新所有多字字段后最后递增`SNAPSHOT_SEQUENCE`;主站读取前后 两次序号一致时,才能认为本次状态一致。 | 偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +128 | AXIS_STATE | U16 | RO | 状态枚举见4.8 | | +129 | AXIS_STATUS_FLAGS | U16 | RO | 方向、输出和限位等标志 | | +130 | ERROR_CODE | U16 | RO | 当前锁存错误 | | +131 | ERROR_DATA_BLOCK | U16 | RO | 出错字段或段号 | | +132 | CURRENT_SEGMENT | U16 | RO | 当前段号1~100,空闲为0 | | +133 | TOTAL_SEGMENTS | U16 | RO | 当前任务总段数 | | +134 | ACTIVE_S2 | U16 | RO | 当前S2套组0~4 | | +135 | LAST_STOP_REASON | U16 | RO | 完成、STOP、限位、急停或错误 | | +136~+137 | CURRENT_FREQUENCY_HZ | U32 | RO | 当前实际指令频率 | | +138~+139 | TARGET_FREQUENCY_HZ | U32 | RO | 当前目标频率 | | +140~+141 | SEGMENT_EMITTED | U32 | RO | 本段已发指令脉冲/AB计数边沿 | | +142~+143 | SEGMENT_REMAINING | U32 | RO | 本段剩余数量 | | +144~+147 | LOGICAL_POSITION | I64 | RO | 当前逻辑位置 | | +148~+151 | TOTAL_PULSE_COUNT | U64 | RO | 总累计输出量 | | +152~+155 | TASK_EMITTED | U64 | RO | 本次任务累计输出量 | | +156 | SEGMENT_EVENT_SEQUENCE | U16 | RO | 每次段事件递增 | | +157 | SEGMENT_EVENT_NUMBER | U16 | RO | 最近事件段号 | | +158 | SEGMENT_EVENT_REASON | U16 | RO | 完成、ACT、EXT、STOP等 | | +159 | SNAPSHOT_SEQUENCE | U16 | RO | 状态快照序号,最后更新 | ### 4.8 AXIS_STATE | 值 | 状态 | |---:|---| | 0 | UNINITIALIZED | | 1 | IDLE | | 2 | ACCEL | | 3 | RUN | | 4 | DECEL | | 5 | WAIT | | 6 | PAUSED | | 7 | COMPLETED | | 8 | STOPPED | | 9 | ERROR | ### 4.9 AXIS_STATUS_FLAGS | 位 | 含义 | |---:|---| | 0 | 指令活动,包括运动、等待和暂停 | | 1 | 物理脉冲正在输出 | | 2 | 正方向 | | 3 | AB模式 | | 4 | 位置有效 | | 5 | 正硬限位有效 | | 6 | 负硬限位有效 | | 7 | 正软限位到达 | | 8 | 负软限位到达 | | 9 | 急停锁存 | | 10 | 影子配置已修改但未提交 | | 11 | 活动配置有效 | | 12~15 | 保留 | ### 4.10 段事件和停止原因 | 值 | 原因 | |---:|---| | 0 | NONE | | 1 | PULSE_COMPLETE | | 2 | WAIT_TIME_COMPLETE | | 3 | WAIT_SIGNAL_ACTIVE | | 4 | ACT_TIME | | 5 | EXT_SIGNAL | | 6 | EXT_OR_COMPLETE_BY_EXT | | 7 | EXT_OR_COMPLETE_BY_PULSE | | 8 | STOP_DECEL | | 9 | STOP_IMMEDIATE | | 10 | POS_LIMIT | | 11 | NEG_LIMIT | | 12 | EMERGENCY_STOP | | 13 | ERROR | | 14 | NORMAL_TASK_COMPLETE | ## 5. S0/S1动态数据池:1000~9199 S0和S1不设置固定数据块地址。主站在1000~9199范围内自行选择不重叠的连续区域, 写入数据后,把首地址分别写入目标轴的`S0_BASE_ADDRESS`和`S1_BASE_ADDRESS`。 动态数据池共8200个保持寄存器,可容纳至少4个满100段的S0数据块、4个S1数据块, 并保留余量。数据池地址已经由PLSR占用,其他模块不得用于通信历史或其他功能。 分配必须满足: 1. S0首地址和S1首地址均位于1000~9199。 2. S1固定占4个寄存器;S0占用`10+段数×10`个寄存器,范围不得越过9199。 3. 任意两个同时存在的数据块不得重叠;允许多个轴只读共享同一个完整数据块。 4. 主站写完数据后计算CRC16,再写入轴基址、字数和期望CRC,最后递增 `AXIS_SHADOW_GENERATION`并发送`COMMIT_AXIS`。 5. COMMIT重新检查范围、长度、CRC和字段内容,成功后复制私有快照;CRC不一致时拒绝 启动并返回“动态数据块正在变化”。 ### 5.1 S1数据块 S1首地址记为`S1_BASE`,由`S1_BASE_ADDRESS`指定: | S1偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +0~+1 | S1_POSITION_MODE | U32 | RW | 0相对,1绝对 | | +2~+3 | S1_START_SEGMENT | U32 | RW | 0或1从第1段开始,2~100从指定段开始 | S1只包含上述两个双字字段。异步调用、命令序号、轴选择、S2选择以及S0/S1基址均不属于S1。 ### 5.2 S0头部 | S0偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +0~+1 | SEGMENT_COUNT | U32 | RW-S | 1~100 | | +2~+9 | RESERVED | - | RES | 对标信捷保留8个寄存器 | ### 5.3 每段10寄存器布局 段号`N`取1~100: ```text SEGMENT_BASE(N) = S0_BASE_ADDRESS + N × 10 ``` | 段内偏移 | 名称 | 类型 | 权限 | 说明 | |---:|---|---|---|---| | +0~+1 | SEGMENT_FREQUENCY | U32 | RW-S | 0表示使用所选S2默认速度 | | +2~+3 | SEGMENT_PULSE_COUNT | I32 | RW-S | 完整INT32范围,负数表示反向 | | +4 | WAIT_CONFIG | U16 | RW-S | 高8位等待条件,低8位参数来源类型 | | +5~+6 | WAIT_VALUE_OR_REFERENCE | U32 | RW-S | 常数值或变量/点编号 | | +7 | JUMP_SOURCE_TYPE | U16 | RW-S | 低8位有效,高8位必须为0 | | +8~+9 | JUMP_VALUE_OR_REFERENCE | U32 | RW-S | 常数段号或变量编号 | 段1位于`S0+10`,段100位于`S0+1000`,最后占用到`S0+1009`。 ### 5.4 WAIT_CONFIG高8位 | 值 | 条件 | 行为 | |---:|---|---| | 0 | PULSE_COMPLETE | 本段数量完成后跳转 | | 1 | WAIT_TIME | 完成后等待指定毫秒数,0按1 ms | | 2 | WAIT_SIGNAL | 完成后等待位信号有效 | | 3 | ACT_TIME | 从段开始计时,到时放弃剩余脉冲并跳转 | | 4 | EXT_SIGNAL | 输入上升沿到来时跳转;若脉冲先完成则等待边沿 | | 5 | EXT_OR_COMPLETE | EXT边沿或脉冲完成先到者触发跳转 | ### 5.5 WAIT_CONFIG低8位 | 值 | 来源 | WAIT_VALUE_OR_REFERENCE含义 | |---:|---|---| | 0 | CONSTANT | 直接常数 | | 1 | HOLDING_VOLATILE | 普通保持寄存器零基地址 | | 2 | HOLDING_BACKUP | Backup SRAM保持变量编号/地址 | | 3 | HOLDING_FLASH | Flash固定参数编号/地址 | | 4 | INPUT_POINT | I点逻辑ID | | 5 | INTERNAL_COIL | 普通内部线圈零基地址 | | 6 | RETAINED_COIL | 掉电保持内部线圈编号 | 对于WAIT_TIME和ACT_TIME,动态数值为无符号毫秒数;对于WAIT_SIGNAL、EXT_SIGNAL和 EXT_OR_COMPLETE,动态数值表示位或输入点。EXT条件只允许有效的外部输入来源。 ### 5.6 JUMP_SOURCE_TYPE | 值 | 来源 | |---:|---| | 0 | CONSTANT | | 1 | HOLDING_VOLATILE | | 2 | HOLDING_BACKUP | | 3 | HOLDING_FLASH | 跳转值范围0~100: - 0:顺序进入下一段;最后一段为0时任务结束。 - 1~100:跳转到指定段。 - 等于当前段:允许有意无限循环。 动态跳转变量在发生段转换时读取。超出范围应进入ERROR,不得越界访问S0。 ## 6. 线圈映射:100~163 为对标信捷“正在发脉冲标志”等位状态,每轴分配16个只读线圈: 该线圈范围已经定义固定状态字段,属于PLSR已占用的线圈地址。其他模块不得覆盖;代码 接入前仍须扫描现有线圈使用情况,若发现历史冲突,必须升级地址表修订号后整体调整。 线圈只是兼容性只读镜像,权威状态全部位于每轴保持寄存器实时状态区;不读取线圈也能 取得完整PLSR状态。 ```text AXIS_COIL_BASE(axis) = 100 + axis × 16 ``` | 偏移 | 名称 | 权限 | 说明 | |---:|---|---|---| | +0 | INSTRUCTION_ACTIVE | RO | 指令仍处于运行/等待/暂停状态 | | +1 | PULSE_ACTIVE | RO | 当前物理脉冲正在输出 | | +2 | COMPLETED | RO | 最近任务正常完成 | | +3 | ERROR | RO | 轴处于错误状态 | | +4 | WAITING | RO | 正在等待段条件 | | +5 | PAUSED | RO | 已暂停 | | +6 | POSITION_VALID | RO | 逻辑位置有效 | | +7 | CONFIG_VALID | RO | 活动配置有效 | | +8 | POS_HARD_LIMIT | RO | 正硬限位有效 | | +9 | NEG_HARD_LIMIT | RO | 负硬限位有效 | | +10 | POS_SOFT_LIMIT | RO | 正软限位到达 | | +11 | NEG_SOFT_LIMIT | RO | 负软限位到达 | | +12 | EMERGENCY_STOP | RO | 软件急停锁存 | | +13 | SEGMENT_EVENT_TOGGLE | RO | 每次段事件翻转,便于PLC/HMI边沿检测 | | +14 | AB_MODE_ACTIVE | RO | 当前使用AB模式 | | +15 | RESERVED | RO | 固定0 | 轴0线圈范围100~115,轴1为116~131,轴2为132~147,轴3为148~163。 这些线圈必须在协议处理层拒绝功能码`0x05`和`0x0F`写入。 ## 7. 对标信捷与本项目增强的边界 ### 7.1 保持信捷语义 - S0头部、每段10寄存器布局、等待类型编码和跳转编码与信捷功能一致。 - S1仅包含相对/绝对和起始段。 - S0、S1由调用方在动态数据池中指定首地址,不绑定轴,也不设置固定数据块地址。 - S2选择0~4套参数,并保留信捷速度、曲线、补偿、FOLLOW和刷新参数。 - 段频率为0时使用S2默认速度。 - 运行中修改目标频率在刷新周期内生效,且不改变剩余脉冲数。 ### 7.2 地址编码边界 - 不把HD、HSD、SFD、SM编号直接复刻为Modbus PDU地址,但必须维持第4.1、4.3和4.4节 规定的一一对应关系。 - 不复制XDPPro配置界面。 - D通过本项目连续逻辑ID保存Q点,并通过轴号、板型映射和资源冲突检查对应信捷Y轴语义。 ### 7.3 本项目增强 - 四轴独立影子参数和原子COMMIT。 - 命令序号防止Modbus重试造成重复运动。 - 64位逻辑位置、累计量和任务计数。 - 独立`INSTRUCTION_ACTIVE`与`PULSE_ACTIVE`,可区分运动和等待。 - 快照序号保证多字状态一致。 - AB相x4计数、两轴AB以及混合输出资源检查。 ## 8. 实现前检查 - [ ] 在`modbus_rtu_slave.h`中增加本地址表常量。 - [ ] 协议处理层实施RO、RW-S、RW-L、WO-T权限。 - [ ] 功能码`0x10`写多字数据时保持原子性。 - [ ] CMD_SEQUENCE写入时对命令参数做一致性快照。 - [ ] COMMIT校验四轴Q点、定时器和AB点对冲突。 - [ ] 状态发布最后更新SNAPSHOT_SEQUENCE。 - [ ] 测试地址边界895/896、999/1000、9199/9200和9999。 - [ ] 测试S0/S1动态块的边界、重叠、共享、长度和CRC校验。 - [ ] 使用四轴各100段执行读写和并发运行压力测试。 - [ ] 按第4.1、4.3和4.4节逐项验证信捷固定地址对应关系,无遗漏、无一对多歧义。