diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx
index 73e0b3e..dd38578 100644
--- a/checher_slave.uvoptx
+++ b/checher_slave.uvoptx
@@ -299,7 +299,7 @@
1
0
- 0
+ 1
18
@@ -382,14 +382,14 @@
0
1
- checker_runcfg
+ g_task_slot
1
- 10
- 0x20006924
+ 8
+ file
0
@@ -523,7 +523,7 @@
1
0
- 1
+ 0
18
@@ -1565,7 +1565,7 @@
rt_thread
- 0
+ 1
0
0
0
diff --git a/doc/CSMZM_V0.13.bin b/doc/CSMZM_V0.13.bin
new file mode 100644
index 0000000..ecb425f
Binary files /dev/null and b/doc/CSMZM_V0.13.bin differ
diff --git a/doc/__csmzm_app.bin b/doc/__csmzm_app.bin
index 605fcad..ddb338f 100644
Binary files a/doc/__csmzm_app.bin and b/doc/__csmzm_app.bin differ
diff --git a/source/ReadMe.txt b/source/ReadMe.txt
index 18a1fab..f73065d 100644
--- a/source/ReadMe.txt
+++ b/source/ReadMe.txt
@@ -301,5 +301,6 @@
添加文件 tran_for_coder.c
2023.12.20
V2.09 使用任务插槽设置电阻校准值成功
-
-
+2023.12.21
+ 新广播命令测试检测,注码正常,加宽了数据上报的时间片
+ 添加异常代码9,槽任务未执行
diff --git a/source/elec_det/elec_judge.c b/source/elec_det/elec_judge.c
index 4856b66..b9de1cf 100644
--- a/source/elec_det/elec_judge.c
+++ b/source/elec_det/elec_judge.c
@@ -340,7 +340,7 @@ int elec_err_classify(int err)
// 找到异常代码序号
int elec_report_err(elec_judge_def *e)
{
- static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,20,0};
+ static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,9,20,0};
uint8_t index=0;
for (int i=0;iexe_flag=1;
}
exe_ret|=checker_runcfg.excue_rtv;
memcpy(t->rets,&checker_runcfg.Test_Rtv[checker_runcfg.rtv_index],checker_runcfg.rtv_count*2);
diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c
index 213e1ff..2b1ba42 100644
--- a/source/elec_det/interface/EWChecker.c
+++ b/source/elec_det/interface/EWChecker.c
@@ -835,18 +835,36 @@ void EW_Test_WriteUID(void)
return;
}
+ delay_os_ms(50);
memcpy(EW_RunBuf,checker_runcfg.writeuid,checker_runcfg.uid_len);
EW_RunBuf[checker_runcfg.uid_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len);
- uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1);
+ uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1);
+ if(uc_rtv){
+ uc_rtv=1;
+ goto end;
+ }
delay_os_ms(50);
- uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1);
+ uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1);
+ if(uc_rtv){
+ uc_rtv=2;
+ goto end;
+ }
delay_os_ms(50);
memcpy(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len);
EW_RunBuf[checker_runcfg.pwd_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len);
- uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1);
+ uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1);
+ if(uc_rtv){
+ uc_rtv=3;
+ goto end;
+ }
delay_os_ms(50);
- uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1);
+ uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1);
+ if(uc_rtv){
+ uc_rtv=4;
+ goto end;
+ }
+ end:
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
@@ -859,10 +877,11 @@ void EW_Test_VerifyUID(void)
System_State_un state;
if(JQXT_Test_IsNeedBind() == 0)
{
- Checker_MaskResult(0,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=0;
+ goto end;
}
//读UID MTP
+ delay_ms(50);
memset(EW_RunBuf,0,sizeof(EW_RunBuf));
EW_ReadMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1);
if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len))
@@ -875,11 +894,11 @@ void EW_Test_VerifyUID(void)
}
if(uc_rtv > 0)
{
- Checker_MaskResult(1,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=1;
+ goto end;
}
+ delay_ms(50);
memset(EW_RunBuf,0,sizeof(EW_RunBuf));
- delay_ms(50);
EW_ReadMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1);
if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len))
{
@@ -891,8 +910,8 @@ void EW_Test_VerifyUID(void)
}
if(uc_rtv > 0)
{
- Checker_MaskResult(2,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=2;
+ goto end;
}
//读PWD MTP
@@ -909,8 +928,8 @@ void EW_Test_VerifyUID(void)
}
if(uc_rtv > 0)
{
- Checker_MaskResult(3,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=3;
+ goto end;
}
memset(EW_RunBuf,0,sizeof(EW_RunBuf));
delay_ms(50);
@@ -925,8 +944,8 @@ void EW_Test_VerifyUID(void)
}
if(uc_rtv > 0)
{
- Checker_MaskResult(4,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=4;
+ goto end;
}
//读UID
@@ -939,8 +958,8 @@ void EW_Test_VerifyUID(void)
}
if(uc_rtv > 0)
{
- Checker_MaskResult(5,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=5;
+ goto end;
}
//验证PWD
memcpy(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len);
@@ -948,8 +967,8 @@ void EW_Test_VerifyUID(void)
uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len);
if(uc_rtv > 0)
{
- Checker_MaskResult(6,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=6;
+ goto end;
}
//读状态
delay_ms(200);
@@ -957,10 +976,12 @@ void EW_Test_VerifyUID(void)
// if(uc_rtv > 0 || state.State_st.erprom_error >0 || state.State_st.pswd_flag == 0)
if(uc_rtv > 0 || state.State_st.pswd_flag == 0)
{
- Checker_MaskResult(7,checker_runcfg.task_info.runindex);
- return;
+ uc_rtv=7;
+ goto end;
}
- Checker_MaskResult(0,checker_runcfg.task_info.runindex);
+
+ end:
+ Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
@@ -973,7 +994,7 @@ void EW_Test_ReadMTP(void)
uint8_t addr=checker_runcfg.params[0];
uint8_t len=checker_runcfg.params[1];
delay_ms(50);
- uc_rtv|EW_ReadMTP(checker_runcfg.netid,addr,EW_RunBuf,len);
+ uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr,EW_RunBuf,len);
Checker_SetRtv((uint16_t *)EW_RunBuf,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
@@ -993,6 +1014,80 @@ void EW_Test_WriteMTP(void)
+// 读流水号
+void EW_Test_ReadSN(void)
+{
+ uint8_t uc_rtv=0;
+ uint8_t addr=9;
+ uint8_t len=4;
+ typedef union{
+ uint8_t arr[4];
+ uint32_t data;
+ }temp_def;
+ temp_def temp={0};
+ uint32_t sn;
+ sn=checker_runcfg.params[0]|(checker_runcfg.params[1]<<16);
+ if(sn>=134217728)
+ {
+ // 如果流水号超过了2^27 则失败
+ uc_rtv=1;
+ goto end;
+ }
+
+ delay_ms(50);
+ uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr,temp.arr,len);
+ if(uc_rtv){
+ uc_rtv=2;
+ goto end;
+ }
+ // 流水号域如果不为要设置的流水号则失败
+ temp.data>>=5;
+ if((temp.data)!=sn){
+ uc_rtv=3;
+ }
+ end:
+ Checker_SetRtv((uint16_t *)&temp,checker_runcfg.rtv_count);
+ Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
+}
+// 写流水号,读改写
+void EW_Test_WriteSN(void)
+{
+ uint8_t uc_rtv=0;
+ uint8_t addr=9;
+ uint8_t len=4;
+ typedef union{
+ uint8_t arr[4];
+ uint32_t data;
+ }temp_def;
+ temp_def temp={0};
+ uint32_t sn;
+ delay_ms(50);
+ uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr,temp.arr,len);
+ if(uc_rtv){
+ uc_rtv=1;
+ goto end;
+ }
+
+ if(sn>=134217728)
+ {
+ // 如果流水号超过了2^27 则失败
+ uc_rtv=2;
+ goto end;
+ }
+ temp.data=(temp.data&0x1f)|(sn<<5);
+ uc_rtv |= EW_WriteMTP(checker_runcfg.netid,addr,temp.arr,len);
+ if(uc_rtv){
+ uc_rtv=3;
+ goto end;
+ }
+ end:
+ Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
+}
+
+
+
+
+
void EW_Empty(void)
{
@@ -1054,6 +1149,8 @@ CheckerExt_Slot, //34 任务插槽
EW_Test_ReadMTP, //35 读取mtp
EW_Test_WriteMTP, //36 写入mtp
CheckerExt_SetCbv, //37 设置电阻校准值
+EW_Test_ReadSN, //38 读取流水号
+EW_Test_WriteSN, //39 写入流水号
(void*)0 //数组结束
};
diff --git a/source/elec_det/interface/JQChecker.c b/source/elec_det/interface/JQChecker.c
index a852b4a..646a29d 100644
--- a/source/elec_det/interface/JQChecker.c
+++ b/source/elec_det/interface/JQChecker.c
@@ -1221,6 +1221,121 @@ void JQ_Test_Toggle(void)
}
+
+
+/*rc{
+写入流水号,使用读改写
+par0,par1,流水号,小端存储
+}*/
+void JQ_Test_WriteSN(void)
+{
+ uint8_t uc_rtv = 0;
+ uint8_t uc_ack;
+ uint8_t uc_otpAddr = 20;
+ uint8_t uc_writeCount = 4;
+ typedef union{
+ uint8_t arr[4];
+ uint32_t data;
+ }temp_def;
+ temp_def temp={0};
+ uint32_t sn=0;
+ JQ_EnWOTP();
+ JQ_EnWOTP();
+ for(int i = 0; i < uc_writeCount;i++)
+ {
+ uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpAddr+i,1,temp.arr+i);
+ if(uc_ack < 1)
+ {
+ uc_rtv = 1;
+ goto end;
+ }
+ }
+
+ sn=checker_runcfg.params[0]|(checker_runcfg.params[1]<<16);
+ if(sn>=134217728)
+ {
+ // 如果流水号超过了2^27 则失败
+ uc_rtv=2;
+ goto end;
+ }
+ // 流水号域如果有值且不为要设置的流水号则失败
+ if((temp.data&(~0x1f))!=0){
+ if((temp.data>>5)!=sn){
+ uc_rtv=3;
+ }
+ goto end;
+ }
+ temp.data=temp.data|(sn<<5);
+ for(int i = 0; i < uc_writeCount;i++)
+ {
+ uc_ack = JQ_WriteOTP(uc_otpAddr+i,1,temp.arr+i);
+ if(uc_ack != 1)
+ {
+ uc_rtv = 4;
+ goto end;
+ }
+
+ }
+ end:
+ Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
+ return;
+}
+
+
+
+/*rc{
+校验流水号
+par0,par1,流水号,小端存储
+ret,校验失败则此任务失败
+rtv,返回读取的流水号数据
+}*/
+void JQ_Test_ReadSN(void)
+{
+ uint8_t uc_rtv = 0;
+ uint8_t uc_ack;
+ uint8_t uc_otpAddr = 20;
+ uint8_t uc_writeCount = 4;
+ typedef union{
+ uint8_t arr[4];
+ uint32_t data;
+ }temp_def;
+ temp_def temp={0};
+ uint32_t sn=0;
+ JQ_EnWOTP();
+ JQ_EnWOTP();
+ for(int i = 0; i < uc_writeCount;i++)
+ {
+ uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpAddr+i,1,temp.arr+i);
+ if(uc_ack < 1)
+ {
+ uc_rtv = 1;
+ goto end;
+ }
+ }
+
+ sn=checker_runcfg.params[0]|(checker_runcfg.params[1]<<16);
+ if(sn>=134217728)
+ {
+ // 如果流水号超过了2^27 则失败
+ uc_rtv=2;
+ goto end;
+ }
+ // 流水号域如果不为要设置的流水号则失败
+ temp.data>>=5;
+ if((temp.data)!=sn){
+ uc_rtv=3;
+ }
+
+ end:
+ Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
+ Checker_SetRtv((uint16_t *)&temp,checker_runcfg.rtv_count);
+ return;
+}
+
+
+
+
+
CheckerTask jqtaskArray[CHECKER_MAXID_COUNT] ={
Checker_PowerPrapare, //0 电源准备
JQ_Test_PowerOn, //1 上电充能
@@ -1266,6 +1381,8 @@ CheckerExt_Repeat ,//40 重新执行任务
CheckerExt_SetUID ,//41 设置uid数据到小板
CheckerExt_Slot ,//42 任务插槽
CheckerExt_SetCbv ,//43 设置电阻校准值
+JQ_Test_WriteSN ,//44 写入流水号
+JQ_Test_ReadSN ,//45 读取流水号
(void*)0 //数组结束
};
diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h
index 8b8d937..6aa1e74 100644
--- a/source/main/compiler_info.h
+++ b/source/main/compiler_info.h
@@ -6,7 +6,7 @@
-#define BUILD_DATE "2023-12-20 17:27:12"
+#define BUILD_DATE "2023-12-21 18:25:05"
#define SOFT_VERSION "2.09"
diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c
index e0de506..3365cb6 100644
--- a/source/task/prot_uc.c
+++ b/source/task/prot_uc.c
@@ -301,7 +301,7 @@ static void protu_send_ontime(protu_def *p,send_pkt_def *s)
uint32_t tick=p->timer->read(p->timer);
// 根据返回的数据长度计算发送需要的时间,添加1ms的余量
// 根据协议,每个指令从机的返回数据长度等长,所以需要的时间窗口也相等
- int wnd_tick=((arr_length(s->t)+15)/16+1);
+ int wnd_tick=((arr_length(s->t)+12)/13+2);
int delay=tick%(wnd_tick*(p->num));
int gap=p->rank*wnd_tick;
if(delay<=gap){
diff --git a/source/task/tran_for_broadcast.c b/source/task/tran_for_broadcast.c
index e7e6030..1ecbbeb 100644
--- a/source/task/tran_for_broadcast.c
+++ b/source/task/tran_for_broadcast.c
@@ -52,11 +52,16 @@
typedef struct{
ucport_def u;
rt_timer_t timer;
- array_def *data;
}slave_def;
+typedef struct{
+ array_def *data;
+}self_def;
+static self_def g_self;
+
+
static slave_def *slave_creat(void)
{
@@ -70,13 +75,13 @@ static void slave_del(ucport_def *u)
{
slave_def *s=(slave_def *)u;
CHECK_DO(s->timer,rt_timer_delete);
- CHECK_DO(s->data,arr_delete);
+ // CHECK_DO(s->data,arr_delete);
free(u);
}
// 找到自己的数据
-static void slave_get_self(slave_def *s)
+static void slave_get_self(self_def *s)
{
int len=arr_length(s->data);
int off=0;
@@ -99,7 +104,7 @@ static void slave_get_self(slave_def *s)
// 添加任务
-static void slave_adds(slave_def *s)
+static void slave_adds(self_def *s)
{
task_def *t=calloc(1,sizeof(task_def));
void *slot=0;
@@ -113,6 +118,7 @@ static void slave_adds(slave_def *s)
t->par_count=arr_get(s->data,2);
t->ret_count=arr_get(s->data,3);
t->errcode=arr_get(s->data,4);
+ t->exe_flag=0;
t->task_index=arr_get(s->data,5);
memcpy(t->params,arr_data(s->data)+6,t->par_count*2);
task_slot_add_item(slot,t);
@@ -124,53 +130,72 @@ static void slave_adds(slave_def *s)
// 生成返回数据
-static array_def *slave_creat_retdata(slave_def *s,array_def *r)
+// 如果ret不为0,则存在未执行的槽任务
+static array_def *slave_creat_retdata(slave_def *s,array_def *r,int *ret)
{
void *slot=task_slot_init();
task_def *t=0;
+ int err=0;
while(t=task_slot_next_item(slot),t!=0)
{
- arr_append(r,t->task_index);
- arr_append(r,t->ret_count);
- arr_appends(r,t->rets,t->ret_count*2);
+ if(t->exe_flag==0){
+ err|=1;
+ }
+ if(r){
+ arr_append(r,t->task_index);
+ arr_append(r,t->ret_count);
+ arr_appends(r,t->rets,t->ret_count*2);
+ }
}
+ if(ret) *ret=err;
return r;
}
+// 重新设置异常代码,异常代码9未执行的槽任务
+#define SET_ERRCODE(arr){\
+ if(slot_exe_flag){\
+ if(arr_get(arr,0)==0){\
+ arr_reset(arr,9,0);\
+ }\
+ }}
+
+
// 执行任务
static int run_task_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
slave_def *s=(slave_def *)u;
+ self_def *g=&g_self;
int pack_curr=0,pack_all=0,pack_size=0;
array_def *r=0;
array_def *check=0;
uint8_t *d;
uint8_t ret_mode=0;
+ int slot_exe_flag=0;
pack_all=arr_get(data,0)|(arr_get(data,1)<<8);
pack_curr=arr_get(data,2);
pack_size=arr_get(data,3);
if(pack_curr==0){
// 第一个数据包重置接收
- CHECK_DO(s->data,arr_delete);
- s->data=arr_creat();
+ CHECK_DO(g->data,arr_delete);
+ g->data=arr_creat();
}
- if(arr_length(s->data)data)data,d,arr_length(data)-4);
- }
- if(arr_length(s->data)data,d,arr_length(data)-4);
r=arr_creat();
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
}
- else if(arr_length(s->data)==pack_all){
+ if(arr_length(g->data)==pack_all){
+ // 延时以保证正常回复到上位机
+ rt_thread_mdelay(50);
// 接收完成后执行命令
- ret_mode=arr_get(s->data,0);
- arr_remove(s->data,0,1);
- slave_get_self(s);
- slave_adds(s);
+ ret_mode=arr_get(g->data,0);
+ arr_remove(g->data,0,1);
+ slave_get_self(g);
+ slave_adds(g);
if(ret_mode!=3){
check=elec_check_with_scheme(0);
}else{
@@ -178,16 +203,20 @@ static int run_task_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_
}
if(ret_mode==0){
// 模式0,只返回检测数据
+ slave_creat_retdata(s,0,&slot_exe_flag);
+ SET_ERRCODE(check);
emit tran_reply_signal(u->p,arr_temp(check));
}else if((ret_mode==1)||(ret_mode==3)){
// 模式1,返回异常代码和任务插槽数据
r=arr_creat();
arr_append(r,arr_get(check,0));
- slave_creat_retdata(s,r);
+ slave_creat_retdata(s,r,&slot_exe_flag);
+ SET_ERRCODE(r);
emit tran_reply_signal(u->p,arr_temp(r));
}else if(ret_mode==2){
// 模式2,返回检测数据和任务插槽数据
- slave_creat_retdata(s,check);
+ slave_creat_retdata(s,check,&slot_exe_flag);
+ SET_ERRCODE(check);
emit tran_reply_signal(u->p,arr_temp(check));
}
}