/*@!Encoding:936*/
const dword VCC2_ID = 0x426; // vcc_2报文ID (11位标准ID)
const dword VCC3_ID = 0x427; // vcc_3报文ID (CAN FD)
const int CYCLE_INTERVAL = 100; // 周期发送间隔(ms)
const int CYCLE_COUNT = 3; // 周期发送次数
int step1Running = 0; // Step1流程运行标志
int step2Running = 0; // Step2流程运行标志
int currentTrigger = 0; // 当前触发源
int cycleCounter = 0; // 周期发送计数器
timer cycleTimer; // 周期发送定时器
void sendVcc3(byte data[32]);
void sendVcc2();
// 系统变量
sysvar int PanelControl::Step1_Trigger;
sysvar int PanelControl::Step2_Trigger;
// 数据定义
byte vcc2Data[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; // vcc_2数据
byte vcc3Step2Data[32] = { // vcc_3第二步数据
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F
};
byte vcc3Step3Same[32]; // vcc_3第三步相同数据
byte vcc3Step3Diff[32] = { // vcc_3第三步不同数据
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
};
void sendVcc2()
{
message vcc2Msg;
vcc2Msg.id = VCC2_ID;
vcc2Msg.isExtended = 0; // 11位标准ID
vcc2Msg.dlc = 8; // 数据长度=8字节
// 使用局部变量替代全局i
for(int i = 0; i < 8; i++) {
vcc2Msg.data[i] = vcc2Data[i];
}
output(vcc2Msg);
write("Step%d: Sent vcc_2 (ID=0x%X)", currentTrigger, VCC2_ID);
}
void sendVcc3(byte data[32])
{
message vcc3Msg;
vcc3Msg.id = VCC3_ID;
vcc3Msg.isExtended = 0;
vcc3Msg.isFD = 1;
vcc3Msg.fdlen = 32;
for(int i = 0; i < 32; i++) {
vcc3Msg.fdData[i] = data[i];
}
output(vcc3Msg);
write("Step%d: Sent vcc_3 (ID=0x%X, Data[0]=0x%02X)",
currentTrigger, VCC3_ID, data[0]);
}
on start
{
// 初始化Step1第三步数据
for(int i = 0; i < 32; i++) {
vcc3Step3Same[i] = vcc3Step2Data[i];
}
write("Test Program Started. Ready for trigger.");
}
on sysvar PanelControl::Step1_Trigger
{
if(getValue(this) == 1 && !step1Running && currentTrigger == 0)
{
step1Running = 1;
currentTrigger = 1;
cycleCounter = 0;
write("\n=== Step1 Triggered ===");
sendVcc2(); // 第一步:发送vcc_2
setTimer(cycleTimer, CYCLE_INTERVAL);
}
}
on sysvar PanelControl::Step2_Trigger
{
if(getValue(this) == 1 && !step2Running && currentTrigger == 0)
{
step2Running = 1;
currentTrigger = 2;
cycleCounter = 0;
write("\n=== Step2 Triggered ===");
sendVcc2(); // 第一步:发送vcc_2
setTimer(cycleTimer, CYCLE_INTERVAL);
}
}
on timer cycleTimer
{
if(currentTrigger == 0) return;
cycleCounter++;
sendVcc3(vcc3Step2Data); // 第二步:周期发送vcc_3
if(cycleCounter < CYCLE_COUNT) {
setTimer(cycleTimer, CYCLE_INTERVAL);
}
else {
// 第三步:发送最终vcc_3
if(currentTrigger == 1) {
sendVcc3(vcc3Step3Same); // Step1:相同数据
}
else {
sendVcc3(vcc3Step3Diff); // Step2:不同数据
}
// 重置状态
write("Step%d: All steps completed.\n", currentTrigger);
step1Running = step2Running = 0;
currentTrigger = 0;
}
} capl脚本
最新发布