optical/NxFuncs/controlbus/controlbus.h
2025-09-04 09:45:08 +08:00

276 lines
7.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __CONTROLBUS_H__
#define __CONTROLBUS_H__
#include "canctrl.h"
/*
基于总线的控制系统支持CAN485等物理层连接
总线中可以挂载多个节点每个节点有唯一的ID。
节点ID可以通过总线遍历设置设置后固化到节点中。需要保证网络中节点ID的唯一性。
根据以上规则,节点和网络的关系可以分为 “向网络输出”和“接收网络数据”。
每个节点可以接收
*/
//-------------------------------------------------------------------------------------------------------------
//-------------------------------------- CAN 通讯的协议定义 -----------------------------------------------
//-------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------
// CAN 数据包
// |--------------------------------------------------------------------
// | exId | data
// |--------------------------------------------------------------------
// |
// |--------------------------------------------------------------------
// |
// |--------------------------------------------------------------------
// CAN 远程包
//-------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------
// exId 的各个部分共29位
#define BNMASK_PRT 0x1F000000 // 通讯协议类型
#define BNMASK_TID 0x00FF0000 // 目标设备ID
#define BNMASK_SID 0x0000FF00 // 源设备ID
#define BNMASK_CMD 0x000000FF // 命令
#define BNMASK_ID (BNMASK_TID|BNMASK_SID)
// 目标设备种类和目标设备ID 构成了通讯节点的标识通讯节点标识在整个CAN网络中要保持唯一
//----------------------------------------------------------------
// 通讯遵循的协议类型
// 通讯协议类型定义
#define BN_PROTOCOL_ALL 0x00 // 所有设备通讯
#define BN_PROTOCOL_MVCTRL 0x01 // 运动控制协议
#define BN_PROTOCOL_HEAD 0x05 // 机头板通讯协议
#define BN_PROTOCOL_COLOR 0x06 // 换色板控制协议
#define BN_PROTOCOL_EXTIO 0x07 // IO扩展板控制协议
#define BN_PROTOCOL_SEWHD 0xA1 // 缝纫机头板控制协议
//----------------------------------------------------------------
// 设备ID 目标设备ID 和 源设备ID每种协议下的ID是可以重复的。
#define BN_ID_BROADCAST 0x00 // 所有ID广播ID
// 其他1--255按照每块板子的分配ID执行
// ID 的分配可以通过总线遍历过程分配,也可以固定分配
//
//
//----------------------------------------------------------------
// 通讯命令定义
#define BN_CMD_BROADCAST 0x00 // 广播命令
#define BN_CMD_TRAVERSE 0x01 // 遍历命令 // 单向指令-主板发给外围板
#define BN_CMD_BUSSTA 0x02 // 总线状态命令 // 单向指令-外围板发给主板
#define BN_CMD_INPUTCHG 0x03 // 输入信号变化
#define BN_CMD_CHGOUTPUT 0x04 // 变化输出信号
#define BN_CMD_REGVAL 0x05 // 状态端口变化(读取寄存器值)
#define BN_CMD_WTREG 0x06 // 写入命令或数据(设置寄存器值)
#define BN_CMD_EXCTRL 0x07 // 外围板控制命令
#define BN_CMD_EXSTA 0x08 // 外围板状态命令
#define BN_CMD_TRANS_DATA 0x09 // 数据传输
#define BN_CMD_NVPARA 0x0A // 读取 or 设置 非易失性参数
//----------------------------------------------------------------
// 遍历命令子命令定义
#define TRA_CMD_ENTER_TRA 0x01 // 进入遍历状态
#define TRA_CMD_EXIT_TRA 0x02 // 退出遍历状态
#define TRA_CMD_NODE_TRA_BEG 0x03 // 遍历设置某节点ID开始
#define TRA_CMD_NODE_TRA_END 0x04 // 遍历设置某节点ID完成
#define TRA_CMD_ASK_TRA_STA 0x05 // 查询所有节点遍历状态
//----------------------------------------------------------------
// 总线节点状态
#define TRA_STA_INIT 0x00 // 初始状态
#define TRA_STA_TRA 0x01 // 进入遍历状态,遍历就绪(收到 进入遍历状态命令)
#define TRA_STA_BEG 0X02 // 遍历开始状态在遍历状态下收到设置节点ID命令
#define TRA_STA_RESP 0x03 // 遍历响应状态(在遍历开始状态下,通过开关触发)
#define TRA_STA_COMP 0x04 // 遍历完成状态(在遍历响应状态下,通过主板发送数据包触发)
//----------------------------------------------------------------
// 寄存器
#define BOARD_VER_LEN 8 // 外围板程序版本长度
// 存储读取到的寄存器值(虚拟寄存器,人为定义)
typedef struct
{
u8 rdnewbverflag; // 读取新程序版本标志
u32 rdbverbitmap; // 程序版本接收位图
u32 exbVer[BOARD_VER_LEN]; // 外围板程序版本
// ...
}BoardRegVal;
#define PORT_ADDR_HIGH 0xFFFF0000
#define PORT_ADDR_LOW 0x0000FFFF
#define BOARD_VERSION 0x00010000 // 程序版本
#define EXBOARD_UPDATE 0x00080000 // 外围板升级
#define GET_NV_PARA 0x00100000 // 读取参数
//----------------------------------------------------------------
// 生成EXID
#define MAKE_EXID(prt, tid, sid, cmd) ( (((u32)((prt)&0x1f))<<24) | (((u32)((tid)&0xff))<<16) | (((u32)((sid)&0xff))<<8) | (((u32)((cmd)&0xff))) )
// 从EXID解析各个字段
#define GET_PRT_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_PRT) >> 24))
#define GET_TID_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_TID) >> 16))
#define GET_SID_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_SID) >> 8))
#define GET_CMD_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_CMD) >> 0))
//----------------------------------------------------------------
// 广播ID
#define BROADCAST_EXID (MAKE_EXID(BN_PROTOCOL_ALL, BN_ID_BROADCAST, BN_ID_BROADCAST, BN_CMD_BROADCAST))
// 生成过滤
#define MAKE_FILTER(exid, rtr) ((((u32)exid)<<3) | CAN_ID_EXT | rtr)
//----------------------------------------------------------------
//----------------------------------------------------------------
typedef union
{
// 使用串口时的通讯包格式
struct
{
u32 sync;
u16 cmd;
u32 addr;
u32 val;
u16 crc;
} __attribute__ ((packed)) sercomm;
// 使用CAN总线时的通讯
struct
{
u16 rev1;
union
{
u32 id;
struct
{
u8 type; // 通讯节点种类或功能种类有效位数为5位支持0--31共32种
u8 tid; // 目标通讯节点id有效位数为8位支持0--255共256个
u8 sid; // 源通讯节点id有效位数为8位支持0--255共256个
u8 cmd; // 通讯命令(功能编码)
} __attribute__ ((packed)) desc;
} __attribute__ ((packed)) exId; // can 通讯的29位 exid
union
{
u8 buff[8]; // buff
struct
{
u8 tracmd; // 子命令
u8 nodeid; // 节点ID
u8 nodetype; // 节点类型
u8 rev[5];
} __attribute__ ((packed)) traverse; // 遍历命令
struct
{
u8 staCode; // 状态代码
u32 cpuid; // 由板卡CPUID生成的校验
u8 nodetype;
u8 signal; // 信号检测,异常为1
// bit0,ZP
// bit1,MP
u8 rev;
} __attribute__ ((packed)) busSta; // 总线状态命令
int64_t inputs; // 输入信号
struct
{
u32 mask;
u32 value;
} __attribute__ ((packed)) outputs; // 输出信号
struct
{
u32 portaddr;
u32 status;
} __attribute__ ((packed)) rdport; // 状态端口
struct
{
u32 portaddr;
u32 wrdata;
} __attribute__ ((packed)) wrport; // 写入端口
struct
{
u16 ccmd; // 控制命令
u8 para[6]; // 参数
} __attribute__ ((packed)) exctrl; // 外围板控制命令
struct
{
u16 esta; // 状态代码
u8 para[6]; // 参数
} __attribute__ ((packed)) exsta; // 外围板状态命令
struct
{
u16 ccmd; // 控制命令
u8 subcmd;
u8 para1;
s32 para2;
} __attribute__ ((packed)) mctrl; // M轴控制
struct
{
u16 ccmd; // 控制命令
u8 currentNP; // 当前针位
u16 mrotCtnAng;
u8 para[3];
} __attribute__ ((packed)) coilpara;
struct
{
u16 cmd; // 子命令
u8 parablockID; // 参数块ID
u8 paraID; // 参数ID
s32 paraval; // 参数值
} __attribute__ ((packed)) headNvPara; // 非易失性参数
} __attribute__ ((packed)) data; // can 通讯的8字节数据
u16 rev2;
} __attribute__ ((packed)) cancomm;
// 其他数据包格式......
} CtrlBusPacket;
//----------------------------------------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
#endif