#pragma once #define SINOmini_Com_NormalLen 12 //*************************指令格式************************************************* //指令头尾 #define SINOmini_STX 0xF0 //模块头 //*************************指令ID************************************************* #define SINOmini_Parameter 0x01 //机架参数设置 enum SINOmini_ParamType { EM_Param000 = 0x00, //0x00:? EM_Param001 = 0x01, //0x01:? EM_Param002 = 0x02, //0x02:? }; #define SINOmini_WarningInfo 0x02 //告警信息 enum SINOmini_WarnType { EM_Warn001 = 0x01, //0x01:开机高压错误 EM_Warn002 = 0x02, //0x02:曝光控制板运行时高压错误 EM_Warn003 = 0x03, //0x03:开机时灯丝错误 EM_Warn004 = 0x04, //0x04:曝光时灯丝错误 EM_Warn005 = 0x05, //0x05:曝光板读存储器错误 EM_Warn006 = 0x06, //0x06:球管过温保护错误,由0x1F解除 EM_Warn007 = 0x07, //0x07:球管运行绕阻线断开错误 EM_Warn008 = 0x08, //0x08:阳极启动信号异常 EM_Warn011 = 0x0B, //0x0B:曝光时高压电源未产生高压,由0xE4解除 EM_Warn228 = 0xE4, //0xE4:解除EM_Warn011 EM_Warn013 = 0x0D, //0x0D:球管打火计数错误 EM_Warn014 = 0x0E, //0x0E:手闸激活没有及时释放,由0xE9解除 EM_Warn233 = 0xE9, //0xE9:解除EM_Warn014 EM_Warn015 = 0x0F, //0x0F:曝光时提前松开手闸错误,由0xEA解除 EM_Warn234 = 0xEA, //0xEA:解除EM_Warn015 EM_Warn016 = 0x10, //0x10:自动测试模式时,没有插短接头错误,由0xE3解除 EM_Warn227 = 0xE3, //0xE3:解除EM_Warn016 EM_Warn017 = 0x11, //0x11:曝光时管电流过高错误 EM_Warn018 = 0x12, //0x12:曝光时管电流过低错误 EM_Warn019 = 0x13, //0x13:灯丝板输入功率不正常 EM_Warn020 = 0x14, //0x14:探测器反馈错误 EM_Warn021 = 0x15, //0x15:曝光时滤线栅抖动错误 EM_Warn025 = 0x19, //0x19:急停开关按下,由0x18解除 EM_Warn024 = 0x18, //0x18:解除EM_Warn025 EM_Warn027 = 0x1B, //0x1B:二次限位开关按下 ,由0x1A解除 EM_Warn026 = 0x1A, //0x1A:解除EM_Warn027 EM_Warn029 = 0x1D, //0x1D:在AAEC模式下,压迫器压力小于30N不可以曝光,由0x1C解除 EM_Warn028 = 0x1C, //0x1C:解除EM_Warn029 EM_Warn031 = 0x1F, //0x1F:系统在运动中(C臂旋转,C臂升降,压迫升降),由0x1E解除 EM_Warn030 = 0x1E, //0x1E:解除EM_Warn031 EM_Warn033 = 0x21, //0x21:屏蔽门打开,由0x20解除 EM_Warn032 = 0x20, //0x20:解除EM_Warn033 EM_Warn035 = 0x23, //0x23:校准开关已打开,由0x22解除 EM_Warn034 = 0x22, //0x22:解除EM_Warn035 EM_Warn037 = 0x25, //0x25:压迫器释放按钮在开机时按下错误,由0x24解除 EM_Warn036 = 0x24, //0x24:解除EM_Warn037 EM_Warn048 = 0x30, //0x30:C臂旋转方向控制引脚失效 EM_Warn049 = 0x31, //0x31:压迫器升降方向控制引脚失效 EM_Warn050 = 0x32, //0x32:系统自检未完成时脚踏开关被踩下,由0xED解除 EM_Warn237 = 0xED, //0xED:解除EM_Warn050 EM_Warn051 = 0x33, //0x33:系统自检未完成时C臂旋转或升降按键被按下,由0xEE解除 EM_Warn238 = 0xEE, //0xEE:解除EM_Warn051 EM_Warn052 = 0x34, //0x34:运动控制板自检未通过错误 EM_Warn053 = 0x35, //0x35:滤线栅控制电路错误 EM_Warn054 = 0x36, //0x36:急停开关按下时运动控制键被按下,由0xF1解除 EM_Warn241 = 0xF1, //0xF1:解除EM_Warn054 EM_Warn055 = 0x37, //0x37:滤片切换超时错误 EM_Warn056 = 0x38, //0x38:运动板SysTick时钟初始化不通过错误 EM_Warn057 = 0x39, //0x39:运动板存储器读取错误 EM_Warn058 = 0x3A, //0x3A:运动板存储器写数据失败错误 EM_Warn059 = 0x3B, //0x3B:C臂电机驱动器错误 EM_Warn060 = 0x3C, //0x3C:压力传感器故障 EM_Warn061 = 0x3D, //0x3D:压迫器电机位置超差错误 EM_Warn062 = 0x3E, //0x3E:C臂电机位置超差错误 EM_Warn063 = 0x3F, //0x3F:推杆电机位置超差错误 EM_Warn064 = 0x40, //0x40:压迫器高度过低时插入放大架错误,由0xF6解除 EM_Warn246 = 0xF6, //0xF6:解除EM_Warn064 EM_Warn065 = 0x41, //0x41:压迫器电机驱动器错误 EM_Warn066 = 0x42, //0x42:推杆电机驱动器错误 EM_Warn067 = 0x43, //0x43:角度校准板失效错误 EM_Warn069 = 0x45, //0x45:开机检测到压力报错,由0xF9解除 EM_Warn249 = 0xF9, //0xF9:解除EM_Warn069 EM_Warn070 = 0x46, //0x46:AEC主曝光MAS小于最小值,由0x48解除 EM_Warn071 = 0x47, //0x47:AEC主曝光MAS大于最大值,由0x48解除 EM_Warn072 = 0x48, //0x48:解除EM_Warn071 EM_Warn073 = 0x49, //0x49:滤线栅自检不通过,由0x50解除 EM_Warn080 = 0x50, //0x50:解除EM_Warn073 EM_Warn081 = 0x51, //0x51:滤过挡片自检不通过 EM_Warn082 = 0x52, //0x52:热容量已满,停止曝光,由0x53解除 EM_Warn083 = 0x53, //0x53:解除EM_Warn082 EM_Warn128 = 0x80, //0x80:运动板问询通信异常 EM_Warn129 = 0x81, //0x81:曝光板问询通信异常 EM_Warn130 = 0x82, //0x82:压力采集板问询通信异常 EM_Warn131 = 0x83, //0x83:X光剂量检测板问询通信异常 EM_Warn132 = 0x84, //0x84:阳极控制板问询通信异常 EM_Warn133 = 0x85 //0x85:显示板通信异常 }; #define SINOmini_ExpStatus 0x03 //曝光状态 enum SINOmini_ExpStatusType { EM_ExpStatus001 = 0x01, //0x01:进入曝光状态 PR1 EM_ExpStatus002 = 0x02, //0x02:曝光预热中 PR2 EM_ExpStatus003 = 0x03, //0x03:进入AEC模式预曝光阶段状态 EM_ExpStatus004 = 0x04, //0x04:AEC模式预曝光结束状态 EM_ExpStatus005 = 0x05, //0x05:正式曝光阶段高压启动完毕发出X射线 EM_ExpStatus006 = 0x06, //0x06:曝光结束 EM_ExpStatus238 = 0xEE, //0xEE:曝光板等待系统冷却,不能进行曝光 EM_ExpStatus239 = 0xEF, //0xEF:曝光板等待系统冷却完毕 EM_ExpStatus254 = 0xFE, //0xFE:正在曝光或曝光条件不充足 EM_ExpStatus255 = 0xFF, //0xFF:系统曝光条件充足 }; #define SINOmini_DevStatus 0x04 //设备状态控制 enum SINOmini_DevStatusType { EM_DevStatus001 = 0x01, //0x01:开启串口后的初始化 EM_DevStatus002 = 0x02, //0x02:SyncTimestamp 时间戳 EM_DevStatus003 = 0x03, //0x03:ExpEnabled 曝光使能开启 EM_DevStatus004 = 0x04, //0x04:ExpEnabled 曝光使能关闭 }; #define SINOmini_cArmAngle 0x06 //c-arm angle #define SINOmini_GenAGD 0x07 //Generator AGD #define SINOmini_WorkMode 0x08 //WORK_MODE #define SINOmini_TubeHeat 0x0B //球管热容量 #define SINOmini_RackAct 0x2A //机架功能 enum SINOmini_RackACTType { EM_RackACT045 = 0x2D, //0x2D:一键归零 EM_RackACT046 = 0x2E, //0x2E:压迫板自动释放 EM_RackACT049 = 0x31, //0x31:在 Get generator warning info, type = 0x22 之后出现 EM_RackACT050 = 0x32, //0x32:Filter EM_RackACT053 = 0x35, //0x35:? EM_RackACT054 = 0x36, //0x36:SendUnixTime EM_RackACT055 = 0x37, //0x37:ENTER_STUDY_QUERY }; struct SINOminiCommand //as same as Exposure Parameter via query { char Command[SINOmini_Com_NormalLen] = {0}; string * pUnCommand = nullptr; SINOminiCommand() { Command[0] = SINOmini_STX; } SINOminiCommand(const char *CMDd,int lengh = 0) { if (lengh > 0 && lengh < SINOmini_Com_NormalLen) { memcpy(Command, CMDd, (SINOmini_Com_NormalLen - 1) * sizeof(char)); } else { pUnCommand = new string(CMDd, lengh); } } SINOminiCommand(char CMDd,char type = 0x00) { Command[0] = SINOmini_STX; Command[1] = CMDd; Command[2] = type; } ~SINOminiCommand() { if (pUnCommand) { delete pUnCommand; pUnCommand = nullptr; } } void SetAt(int pos,char value) { --pos; if (pos >= 0 && pos < SINOmini_Com_NormalLen-1) { Command[pos] = value; } } char GetAt(int pos) { --pos; if (pos >= 0 && pos <= SINOmini_Com_NormalLen - 1) { return Command[pos]; } return Command[SINOmini_Com_NormalLen - 1]; } const char* Get_Hex_Log() { char temp[5] = {0}; string log; if (pUnCommand) { for (int i = 0; i < pUnCommand->length(); i++) { if (i == pUnCommand->length() - 1) { sprintf_s(temp, 4, "%02x", (UINT8)(pUnCommand->at(i))); } else sprintf_s(temp, 4, "%02x ", (UINT8)(pUnCommand->at(i))); log += temp; } } else for (int i = 0; i < SINOmini_Com_NormalLen - 1; i++) { if (i == SINOmini_Com_NormalLen - 2) { sprintf_s(temp, 4, "%02x", (UINT8)Command[i]); } else sprintf_s(temp, 4, "%02x ", (UINT8)Command[i]); log += temp; } return log.c_str(); } void SetCRC(char (*fun)(char* cmdData, int size)) { UINT8 Checksum = fun(Command, SINOmini_Com_NormalLen - 2); Command[10] = Checksum; } operator const char* () const { return Command; } };