Browse Source

认证包ok

master
liyating 4 years ago
parent
commit
fe31a3d76d
  1. 25
      keilp/cc_as_stc02_ps5ws.uvprojx
  2. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_sym
  3. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xab
  4. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xad
  5. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xc
  6. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xf
  7. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xm
  8. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xr
  9. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xsb
  10. BIN
      si4/ps5ws.si4project/soft_ps5ws.sip_xsd
  11. BIN
      si4/ps5ws.si4project/soft_ps5ws.siproj
  12. 132
      source/app/app_config.c
  13. 95
      source/app/app_config.h
  14. 128
      source/app/app_task_tcp.c
  15. 10
      source/app/app_task_tcp.h
  16. 80
      source/app/app_task_tcp_control.c
  17. 22
      source/app/app_task_tcp_control.h
  18. 31
      source/app/main.c
  19. 4
      source/app/main.h
  20. 1
      source/app/task_key
  21. 126
      source/app/task_key.c
  22. 33
      source/app/task_key.h
  23. 190
      source/app/task_modbus.c
  24. 35
      source/app/task_pen_head.c
  25. 22
      source/app/task_pen_head.h
  26. 8
      source/app/task_register.c
  27. 157
      source/app/task_w600.c
  28. 39
      source/app/task_w600.h
  29. 8
      source/bsp/bsp_config.c
  30. 8
      source/bsp/bsp_config.h
  31. 3
      source/clib/clib.c
  32. 2
      source/clib/clib.h
  33. 4
      source/ctask/tick.h
  34. 21
      source/msp/UART0.C
  35. 46
      source/msp/UART2.C
  36. 12
      source/msp/UART2.h
  37. 7
      source/tpc/at0d0a.c
  38. 149
      source/tpc/ccmodbus.c
  39. 25
      source/tpc/ccmodbus.h
  40. 178
      source/tpc/modbus.c
  41. 2
      source/tpc/modbus.h

25
keilp/cc_as_stc02_ps5ws.uvprojx

@ -332,11 +332,6 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\source\app\task_register.c</FilePath> <FilePath>..\source\app\task_register.c</FilePath>
</File> </File>
<File>
<FileName>task_modbus.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_modbus.c</FilePath>
</File>
<File> <File>
<FileName>app_config.c</FileName> <FileName>app_config.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -347,6 +342,26 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\source\app\task_w600.c</FilePath> <FilePath>..\source\app\task_w600.c</FilePath>
</File> </File>
<File>
<FileName>task_key.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_key.c</FilePath>
</File>
<File>
<FileName>app_task_tcp_control.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_task_tcp_control.c</FilePath>
</File>
<File>
<FileName>task_pen_head.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_pen_head.c</FilePath>
</File>
<File>
<FileName>app_task_tcp.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_task_tcp.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_sym

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xab

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xad

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xc

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xf

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xm

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xr

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xsb

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.sip_xsd

Binary file not shown.

BIN
si4/ps5ws.si4project/soft_ps5ws.siproj

Binary file not shown.

132
source/app/app_config.c

@ -4,11 +4,15 @@
#include "../msp/eeprom.h" #include "../msp/eeprom.h"
#include "../clib/clib.h" #include "../clib/clib.h"
GlobalParam G; GlobalParam G;
GlobalRegister R; GlobalRegister R;
WR_Buf wr_buf;
void L3_param_init(void) void L3_param_init(void)
{ {
U8 i;
G.debug = 1; G.debug = 1;
//station模式状态 //station模式状态
G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok
@ -22,6 +26,13 @@ void L3_param_init(void)
Lc_strcpy(G.ap_sid,"cc_pen_ap"); Lc_strcpy(G.ap_sid,"cc_pen_ap");
//ap模式pwd //ap模式pwd
Lc_strcpy(G.ap_pwd,"ccsens123"); Lc_strcpy(G.ap_pwd,"ccsens123");
wr_buf.wIndex = wr_buf.rIndex = 0;
wr_buf.maxsize = POINT_LEN;
for(i=0;i<wr_buf.maxsize;i++)
{
wr_buf.buf[i].time = wr_buf.buf[i].x_axis = wr_buf.buf[i].y_axis = 0;
}
} }
@ -45,13 +56,14 @@ void L3_reg_2_iap(void)
{ {
L0_uart0_sendstr("e2p write success"); L0_uart0_sendstr("e2p write success");
} }
#endif
if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p,sizeof(R.p),TRUE) == 0) if(L1_eep_write_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p,sizeof(R.p),TRUE) == 0)
{ {
L0_uart0_sendstr("e2p write success"); L0_uart0_sendstr("e2p write success");
return; return;
} }
L0_uart0_sendstr("e2p write failed"); L0_uart0_sendstr("e2p write failed");
#endif
} }
//读取iap内容,写入reg //读取iap内容,写入reg
@ -74,58 +86,67 @@ void L3_iap_2_reg(void)
R.p.adc_blur_shift[2] = iapData.adc_blur_shift[2]; R.p.adc_blur_shift[2] = iapData.adc_blur_shift[2];
R.p.adc_blur_threshold[0] = iapData.adc_blur_threshold[0]; R.p.adc_blur_threshold[0] = iapData.adc_blur_threshold[0];
R.p.adc_blur_threshold[1] = iapData.adc_blur_threshold[1]; R.p.adc_blur_threshold[1] = iapData.adc_blur_threshold[1];
#endif
if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p, NULL) == 0) if(L1_eep_read_block(D_EEP_PARAM_IN_SECTOR, D_EEP_PARAM_IN_BLOCK, D_EEP_SECTOR_BLOCK_SIZE, (U8*)&R.p, NULL) == 0)
{ {
L0_uart0_sendstr("e2p read success"); L0_uart0_sendstr("e2p read success");
return; return;
} }
L0_uart0_sendstr("e2p read failed"); L0_uart0_sendstr("e2p read failed");
#endif
} }
void L3_reg_reset(void) void L3_reg_reset(void)
{ {
U8 i = 0; U8 i = 0;
//R.p.adc_ch_status = ADC_status_ch2_Ready | ADC_status_ch3_Ready | ADC_status_ch4_Ready; //修改采集通道
R.p.slaver_id = D_UART0_485_SLAVER_ID;
//R.p.weight_max = 500; //500kg
//R.p.lmd = 2; //2mv/v
//R.p.adc_blur_mid = 1;
//R.p.adc_blur_avg = 6;
//R.p.adc_blur_shift[0] = 0;
//R.p.adc_blur_shift[1] = 2;
//R.p.adc_blur_shift[2] = 4;
//R.p.adc_blur_threshold[0] = 1600; //g
//R.p.adc_blur_threshold[1] = 700; //g
R.pen_sta = 0; R.pen_sta = 0;
R.pen_net_sta = 0; R.pen_net_sta = 0;
R.pen_ele_sta = 0; R.pen_ele_sta = 0;
R.question_sta = 0; R.question_sta = 0;
R.spee_save = 0;
R.oid3_order = 0; R.oid3_order = 0;
R.pack_order = 0; R.pack_order = 0;
R.frame_order = 0; R.frame_order = 0;
R.x_axis1 = 0; R.points.x_axis = R.points.y_axis = 0;
R.y_axis1 = 0; R.points.time = 0;
R.time1 = 0;
R.x_axis2 = 0;
R.y_axis2 = 0;
R.time2 = 0;
for(i=0;i<CCMD_SLAVER_INFO_MAX;i++) for(i=0;i<CCMD_SLAVER_INFO_MAX;i++)
{ {
R.ccmd_slaver_info[i].mask = 0; G.ccmd_slaver_info[i].mask = 0;
} }
R.ccmd_slaver_info[0].slaver = SLAVER_TCP_SERVER_ID; //认证包
R.ccmd_slaver_info[0].oper = MODBUS_OPER_WRITE_M; G.ccmd_slaver_info[0].slaver = SLAVER_TCP_SERVER_ID;
R.ccmd_slaver_info[0].reg = 0x00; G.ccmd_slaver_info[0].oper = MODBUS_OPER_AUTH;
R.ccmd_slaver_info[0].regnum = 0x21; G.ccmd_slaver_info[0].mask = 0;
R.ccmd_slaver_info[0].bytes = R.ccmd_slaver_info[0].regnum * 2; //心跳包
R.ccmd_slaver_info[0].buf = (U8*)&R.pen_sta; G.ccmd_slaver_info[1].slaver = SLAVER_TCP_SERVER_ID;
R.ccmd_slaver_info[0].mask = 2; G.ccmd_slaver_info[1].oper = MODBUS_OPER_PING;
G.ccmd_slaver_info[1].mask = 0;
//数据包
G.ccmd_slaver_info[2].slaver = SLAVER_TCP_SERVER_ID;
G.ccmd_slaver_info[2].oper = MODBUS_OPER_WRITE_M;
G.ccmd_slaver_info[2].reg = 0x20;
G.ccmd_slaver_info[2].regnum = 0x03;//基础数量,程序每次应动态添加点数
G.ccmd_slaver_info[2].bytes = G.ccmd_slaver_info[2].regnum * 2;
G.ccmd_slaver_info[2].buf = (U8*)&R.pack_order;
G.ccmd_slaver_info[2].mask = 0;
G.ccmd_slaver_info[2].extra_num =0;
G.modbusstmp = 0;
G.authed = 0;
G.flowStarted = 0;
G.flowStartVal = 1;
} }
void L3_reg_init(void) void L3_reg_init(void)
{ {
//R.reserved1 = R.reserved2 = R.reserved3 = 0x55; //R.reserved1 = R.reserved2 = R.reserved3 = 0x55;
@ -134,4 +155,59 @@ void L3_reg_init(void)
L3_reg_reset(); L3_reg_reset();
L3_iap_2_reg(); L3_iap_2_reg();
} }
void Lc_buf_full(WR_Buf *p)
{
if((p->rIndex+1)%(p->maxsize) == p->wIndex)
p->full = 1;
}
U16 Lc_write_cyc_buf(PenPoint *wbuf ,WR_Buf *wp ,U16 wlen)
{
U8 nulllen = (wp->maxsize - wp->wIndex + wp->rIndex - 1) % wp->maxsize;
if(nulllen >= wlen)
{
wp->readdr = (wp->wIndex + wlen) % wp->maxsize;
if(wp->readdr > wp->wIndex || wp->readdr == 0)
{
Lc_buf_copy_uc((U8 *)&wp->buf[wp->wIndex], (U8 *)wbuf, wlen);
}
else
{
wp->relen = wlen - wp->readdr;
Lc_buf_copy_uc((U8 *)&wp->buf[wp->wIndex], (U8 *)wbuf, wp->relen);
Lc_buf_copy_uc((U8 *)&wp->buf[0], (U8 *)(wbuf+wp->relen), wp->readdr);
}
wp->wIndex = wp->readdr;
return sizeof(wbuf);
}
else
{
//L0_uart0_sendstr("X");
return 0;
}
}
U16 Lc_read_cyc_buf(PenPoint *rbuf ,WR_Buf *rp ,U16 rlen)
{
U8 validlen = (rp->maxsize - rp->rIndex + rp->wIndex) % rp->maxsize;
if(validlen >= rlen)
{
rp->readdr = (rp->rIndex + rlen) % rp->maxsize;
if(rp->readdr < rp->wIndex || rp->readdr == 0)
{
Lc_buf_copy_uc((U8 *)rbuf, (U8 *)&rp->buf[rp->rIndex],rlen);
}
else
{
rp->relen = rlen - rp->readdr;
Lc_buf_copy_uc((U8 *)rbuf,(U8 *) &rp->buf[rp->rIndex], rp->relen);
Lc_buf_copy_uc((U8 *)(rbuf+rp->relen), (U8 *)&rp->buf[0], rp->readdr);
}
rp->rIndex = rp->readdr;
return sizeof(rbuf);
}
else
{
return 0;
}
}

95
source/app/app_config.h

@ -3,13 +3,17 @@
#include "../clib/type.h" #include "../clib/type.h"
#include "../bsp/bsp_config.h" #include "../bsp/bsp_config.h"
#include "../bsp/bsp_config.h"
#include "../tpc/ccmodbus.h" #include "../tpc/ccmodbus.h"
#include "../tpc/modbus.h"
#define APP_VERSION 0x10 #define APP_VERSION 0x10
#define SLAVER_TCP_SERVER_ID 0x10 #define SLAVER_TCP_SERVER_ID 0x14
#define APP_VERSION_HEX 0x11 //高4位主版本,低4位次版本
#define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 )) #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 ))
#define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000) #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000)
#define POINT_LEN 48
//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG
@ -18,42 +22,34 @@
//#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max )) //#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max ))
#define CCMD_SLAVER_INFO_MAX 4 #define CCMD_SLAVER_INFO_MAX 3
typedef struct pen_point
{
U16 x_axis;//横坐标
U16 y_axis;//纵坐标
U32 time;//时间
}PenPoint;
typedef struct global_register typedef struct global_register
{ {
//RO Register //RO Register
U16 w600_mode; U16 pen_sta;//点读笔状态
U16 pen_sta; U16 pen_net_sta;//联网状态
U16 pen_net_sta; U16 pen_ele_sta;//电池电量
U16 pen_ele_sta; U16 question_sta;//问题 0上题 1下题
U16 question_sta; U16 spee_order;//语音序号
U16 spee_save; U32 oid3_order;//序号通知(oid3普通码)
U32 oid3_order;
U16 pack_order; char null[25];
U16 frame_order;
U32 x_axis1; U16 pack_order;//包序号
U32 y_axis1; U16 frame_order;//帧序号
U32 time1; U16 pack_mask;//包标志
U32 x_axis2; PenPoint points[POINT_LEN];
U32 y_axis2;
U32 time2;
CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX];
//RW Register
U16 reserved2;
U16 zero; //清0标志,写入任何值清0(去皮)
U16 status_eep_save; //eep写入寄存器,1则写入eep并清0
//U16 reset; //reset标志,写入任何值,所有参数恢复初始值
struct
{ //需要持久化的参数,不能超过72字节,否则会导致eeprom溢出
U16 slaver_id;
}p;
U16 reserved3;
}GlobalRegister; }GlobalRegister;
extern GlobalRegister R; extern GlobalRegister R;
//寄存器内存基地址 //寄存器内存基地址
#define REG_MEM_BASE ((U16*)(&R)) //寄存器基础地址(本文件外部不应该使用该宏定义) #define REG_MEM_BASE ((U16*)(&R)) //寄存器基础地址(本文件外部不应该使用该宏定义)
//变量地址转寄存器 //变量地址转寄存器
@ -64,15 +60,12 @@ extern GlobalRegister R;
//STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Global Variables CONFIG //STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Global Variables CONFIG
typedef struct global_param typedef struct global_param
{ {
//调试模式 //调试模式
U8 debug; U8 debug;
U8 reset;
//station模式状态 //station模式状态
U8 st_status; //0:none 1:wifi_ok 2:tcp_connect_ok U8 st_status; //0:none 1:wifi_ok 2:tcp_connect_ok
//station模式sid //station模式sid
@ -85,15 +78,43 @@ typedef struct global_param
U8 ap_sid[32]; U8 ap_sid[32];
//ap模式pwd //ap模式pwd
U8 ap_pwd[32]; U8 ap_pwd[32];
//w600联网模式
U16 w600_mode;
U16 status_eep_save;
U16 slaver_id;
vU32 modbusstmp;
U16 authed;
U16 flowStarted;
U16 flowStartVal;
U8 mcu_id[7];
U8 pen_up;
CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX];
}GlobalParam; }GlobalParam;
extern struct global_param G;
//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Global Variables CONFIG End
extern GlobalParam G;
//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Global Variables CONFIG End
typedef struct
{
vU8 rIndex;//读标志
vU8 wIndex;//写标志
vU8 full;//缓冲区满标志位
vU8 maxsize;//数组最大长度
vU8 readdr;//缓冲区读写结束新地址
vU8 relen;//从缓冲区头开始的新长度
PenPoint buf[POINT_LEN * 2];
}WR_Buf;
extern WR_Buf wr_buf;
extern void L3_param_init(void); extern void L3_param_init(void);
extern void L3_reg_2_iap(void); extern void L3_reg_2_iap(void);
extern void L3_iap_2_reg(void); extern void L3_iap_2_reg(void);
extern void L3_reg_reset(void); extern void L3_reg_reset(void);
extern void L3_reg_init(void); extern void L3_reg_init(void);
extern void Lc_buf_full(WR_Buf *p);
extern U16 Lc_write_cyc_buf(PenPoint *wbuf ,WR_Buf *wp ,U16 wlen);
extern U16 Lc_read_cyc_buf(PenPoint *rbuf ,WR_Buf *rp ,U16 rlen);
#endif #endif

128
source/app/app_task_tcp.c

@ -0,0 +1,128 @@
#include "app_task_tcp.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../app/task_w600.h"
#include "../app/app_config.h"
#define MODBUS_SLAVER_DW20_REG_START 0x02
#define MODBUS_SLAVER_DW20_REG_NUM 0x02
#define MODBUS_SLAVER_RETRY_MAX_TIME 1
TS_tcp ts_tcp;
void L3_task_tcp_init(void)
{
L1_task_init(&ts_tcp.task);
L3_task_s_go(ts_tcp,D_task_init);
ts_tcp.slaverIndex = 0;
ts_tcp.pkglen = 0;
ts_tcp.retryTimes = 0;
ts_tcp.ackFlag = 0;
}
#define D_task_tcp_constructor_modbus_pkg 0x51
#define D_task_tcp_send_modbus_pkg 0x52
#define D_task_tcp_wait_modbus_ack 0x53
#define D_task_tcp_switch_next_slaver 0x54
void L3_task_tcp_handle(TS_tcp *s)
{
TTSS_Task_init()
L2_task_go(D_task_tcp_constructor_modbus_pkg);
TTSS_Task_step(D_task_tcp_constructor_modbus_pkg) //构造包
if(G.ccmd_slaver_info[s->slaverIndex].mask > 0)
{
s->pkglen = L3_pack_ccmodbus(&s->loopPkg,G.ccmd_slaver_info + s->slaverIndex);
s->ackFlag = 0;
s->retryTimes = 0;
L2_task_go(D_task_tcp_send_modbus_pkg);
}
else
{
L2_task_go(D_task_tcp_switch_next_slaver);
}
TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包
L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen);
s->sendStamp = s_nos_tick.t_1s;
if(G.ccmd_slaver_info[s->slaverIndex].mask == 1)
{
G.ccmd_slaver_info[s->slaverIndex].mask = 0;
}
L2_task_go(D_task_tcp_wait_modbus_ack);
TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack
//L0_uart0_uc(s_uart2_tcp_rec.ok + '0');
if(s_uart2_tcp_rec.ok)
{
s_uart2_tcp_rec.ok = 0;
s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s;
s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp);
L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num);
if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver)
{
s->ackFlag = 1;
switch(s->slaverIndex)
{
case 0://如果oper == 90:成功,91 == 不成功
switch(G.ccmd_slaver_info[s->slaverIndex].oper)
{
case 0x90:
//L0_uart0_sendstr("11111");
G.authed = 1;
break;
case 0x91:
G.authed = 0;
break;
}
#if 0
if(G.ccmd_slaver_info[s->slaverIndex].oper == 0x90)
{
L0_uart0_sendstr("111");
G.authed = 1;
G.au_succ = 1;
}
else
{
L0_uart0_sendstr("222");
G.authed = 0;
G.au_fail = 1;
}
#endif
break;
case 2:
break;
default:
break;
}
}
L2_task_go(D_task_tcp_switch_next_slaver);
}
else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发
{
if(++s->retryTimes < 3)
{
L2_task_go(D_task_tcp_send_modbus_pkg);
}
else
{
L2_task_go(D_task_tcp_switch_next_slaver);
}
}
//L0_uart0_uc(s->ackFlag);
TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个
if(++ s->slaverIndex >= CCMD_SLAVER_INFO_MAX)
{
s->slaverIndex = 0;
}
L2_task_go(D_task_tcp_constructor_modbus_pkg);
TTSS_Task_end();
}

10
source/app/app_task_tcp.h

@ -2,8 +2,9 @@
#define APP_TASK_TCP #define APP_TASK_TCP
#include "../ctask/task.h" #include "../ctask/task.h"
#include "../tpc/tpc_ccmodbus.h" #include "../tpc/ccmodbus.h"
#include "app_common.h" #include "../app/app_config.h"
#define U485_TIMEOUT 3 //3 x 100ms = 300ms
typedef struct typedef struct
{ {
@ -18,11 +19,12 @@ typedef struct
U16 treg; U16 treg;
}TS_tcp; }TS_tcp;
#define U485_TIMEOUT 3 //3 x 100ms = 300ms
extern TS_tcp ts_tcp; extern TS_tcp ts_tcp;
extern void L3_task_tcp_init(); extern void L3_task_tcp_init(void);
extern void L3_task_tcp_handle(TS_tcp *s); extern void L3_task_tcp_handle(TS_tcp *s);
#endif #endif

80
source/app/app_task_tcp_control.c

@ -0,0 +1,80 @@
#include "app_task_tcp_control.h"
#include "../msp/uart0.h"
#include "../app/task_w600.h"
#include "../app/app_task_tcp.h"
TS_tcp_control ts_tcp_control;
void L3_task_tcp_control_init(void)
{
L1_task_init(&ts_tcp_control.task);
L3_task_s_go(ts_tcp_control,D_task_init);
ts_tcp_control.conn_ok_pool = 0;
ts_tcp_control.tcp_send_stmp = 0;
}
#define D_task_tcp_control_01 0x51
#define D_task_tcp_control_02 0x52
#define D_task_tcp_control_03 0x53
void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区满,调用读函数读取一段,从G->R, R.extra num 动态修改数量
{
TTSS_Task_init()
L2_task_go(D_task_tcp_control_01);
TTSS_Task_step(D_task_tcp_control_01)
if(s->conn_ok_pool != s_task_gm35_flow.conn_ok)
{
G.authed = 0;
s->conn_ok_pool =s_task_gm35_flow.conn_ok;
}
L2_task_go(D_task_tcp_control_02);
TTSS_Task_step(D_task_tcp_control_02)//是否发认证包
if(s_task_gm35_flow.conn_ok)
{
//3s一次发送数据包
if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3)
{
if(!G.authed)
{
//L0_uart0_sendstr("111");
//发送认证包
G.ccmd_slaver_info[0].mask = 1;
L2_task_go(D_task_tcp_control_01);
}
else
{
L2_task_go(D_task_tcp_control_03);
}
ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s;
}
else if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 60)
{
G.ccmd_slaver_info[1].mask = 1;
L2_task_go(D_task_tcp_control_01);
ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s;
}
}
TTSS_Task_step(D_task_tcp_control_03)
if(wr_buf.full == 1)
{
wr_buf.full = 0;
Lc_read_cyc_buf(&R.points ,&wr_buf ,POINT_LEN);
G.ccmd_slaver_info[2].mask = 1;
L2_task_go(D_task_tcp_control_01);
}
else if(G.pen_up == 1)
{
Lc_read_cyc_buf(&R.points ,&wr_buf ,sizeof(wr_buf.buf)/2);
G.ccmd_slaver_info[2].mask = 1;
L2_task_go(D_task_tcp_control_01);
}
TTSS_Task_end();
}

22
source/app/app_task_tcp_control.h

@ -0,0 +1,22 @@
#ifndef APP_TASK_TCP_CONTROL
#define APP_TASK_TCP_CONTROL
#include "../ctask/task.h"
#include "../tpc/ccmodbus.h"
#include "../app/app_config.h"
typedef struct
{
TS_task task;
vU8 conn_ok_pool;
vU32 tcp_send_stmp;
}TS_tcp_control;
extern TS_tcp_control ts_tcp_control;
extern void L3_task_tcp_control_init(void);
extern void L3_task_tcp_control_handle(TS_tcp_control *s);
#endif

31
source/app/main.c

@ -81,12 +81,13 @@ void L0_main_init(void)
//Lc_delay_ms(100); //Lc_delay_ms(100);
L1_tick_init(); L1_tick_init();
//开启全局中断 //开启全局中断
EA = 1; EA = 1;
//系统时钟初始化 //系统时钟初始化
L0_timer0_Init(); L0_timer0_Init();
//L0_key_init();
//G初始化 //G初始化
L3_param_init(); L3_param_init();
//R初始化 //R初始化
@ -99,9 +100,11 @@ void L0_main_init(void)
//w600任务初始化 //w600任务初始化
L3_task_gm35_flow_init(W600_ST); L3_task_gm35_flow_init(W600_ST);
//笔头任务初始化
//L3_task_tcp_init(); //485轮询任务初始化 L3_task_pen_head_init();
//L3_task_tcp_control_init(); //tcp轮询任务初始化
L3_task_tcp_init();
L3_task_tcp_control_init();
} }
//=============================================== //===============================================
@ -111,7 +114,8 @@ void main(void)
{ {
//初始化 //初始化
L0_main_init(); L0_main_init();
//获取mcu id
L0_id_get_rom(G.mcu_id);
//打印版本信息 //打印版本信息
L0_uart0_sendArray("v1.0",4); L0_uart0_sendArray("v1.0",4);
@ -123,19 +127,28 @@ void main(void)
//LED0 ^= 1; //LED0 ^= 1;
} }
//WIFI
L3_uart2_exp_protocol(&s_uart2_at); L3_uart2_exp_protocol(&s_uart2_at);
L2_task_gm35_flow_handle(&s_task_gm35_flow); L2_task_gm35_flow_handle(&s_task_gm35_flow);
//笔头数据采集
L3_task_pen_head_handle(&s_task_pen_head);
//寄存器值监控 //寄存器值监控
L3_task_reglisten_handle(&s_task_reglisten); //L3_task_reglisten_handle(&s_task_reglisten);
//输出,响应485协议 //输出,响应485协议
L3_task_modbus_handler(&s_uart0_rec); //L3_task_modbus_handler(&s_uart0_rec);
//按键处理
//L3_task_key_handle(&s_task_key_handle);
//L3_task_modbus_handler2(&s_uart2_rec); //L3_task_modbus_handler2(&s_uart2_rec);
//tcp发送 //tcp发送
//L3_task_tcp_handle(&ts_tcp); L3_task_tcp_handle(&ts_tcp);
//tcp master->slaver发送逻辑控制 //tcp master->slaver发送逻辑控制
//L3_task_tcp_control_handle(&ts_tcp_control); L3_task_tcp_control_handle(&ts_tcp_control);
} }
} }
//end main //end main

4
source/app/main.h

@ -54,6 +54,10 @@
#include "../app/task_register.h" #include "../app/task_register.h"
#include "../app/task_encrypt.h" #include "../app/task_encrypt.h"
#include "../app/task_w600.h" #include "../app/task_w600.h"
#include "../app/task_key.h"
#include "../app/task_pen_head.h"
#include "../app/app_task_tcp.h"
#include "../app/app_task_tcp_control.h"
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////

1
source/app/task_key

@ -0,0 +1 @@

126
source/app/task_key.c

@ -0,0 +1,126 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_test.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_key.h"
#include "../clib/clib.h"
struct _s_task_key_ s_task_key_handle;
void L0_key_init(void)
{
//使能 INT1下降沿中断
IT0 = 0;
//外部中断允许
EX0 = 1;
//使能 INT1下降沿中断
IT1 = 0;
//外部中断允许
EX1 = 1;
L1_task_init(&s_task_key_handle.task);
L3_task_s_go(s_task_key_handle,D_task_init);
}
void INT0_isrHanddle(void) D_SERVE_INT0
{
struct _s_task_key_ *p = &s_task_key_handle;
EX0=0; //关中断
//do sth
if(key1 == 0)
{
//Lc_delay_ms(10);//按键防抖
if(key1 == 0)
{
p->key1_ok = 1;
while(!key1)
{
p->time1++;
}
}
}
IE0 = 0; //清除INT0中断程序执行过程中的中断请求
EX0 = 1; //开中断
}
void INT1_isrHanddle(void) D_SERVE_INT1
{
struct _s_task_key_ *p = &s_task_key_handle;
EX1 = 0; //关中断
//do sth
if(key2 == 0)
{
//Lc_delay_ms(10);
if(key2 == 0)
{
p->key2_ok = 1;
while(!key2)
{
p->time2++;
}
}
}
IE1 = 0; //清除INT1中断程序执行过程中的中断请求
EX1 = 1; //开中断
}
void L3_task_key_handle(struct _s_task_key_ *p)
{
if(p->key1_ok)
{
if(p->time1>=180)
{
LED1 = ~LED1;
}
else
{
LED2 = ~LED2;
}
p->key1_ok = 0;
p->time1=0;
}
if(p->key2_ok)
{
if(p->time2>=180)
{
LED1 = ~LED1;
}
else
{
LED2 = ~LED2;
}
p->key2_ok = 0;
p->time2=0;
}
if(key3 == 0)
{
//Lc_delay_ms(10);//按键防抖
if(key3 == 0)
{
p->key3_ok = 1;
while(!key3)
{
p->time3++;
}
}
}
if(p->key3_ok)
{
if(p->time3>=180)
{
LED1 = ~LED1;
}
else
{
LED2 = ~LED2;
}
p->key3_ok = 0;
p->time3=0;
}
}

33
source/app/task_key.h

@ -0,0 +1,33 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_test.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _app_task_key_H
#define _app_task_key_H
#include "../bsp/bsp_config.h"
#include "../ctask/task.h"
struct _s_task_key_
{
TS_task task;
vU8 key1_ok;
vU8 key2_ok;
vU8 key3_ok;
vU8 time1;
vU8 time2;
vU8 time3;
};
extern struct _s_task_key_ s_task_key_handle;
extern void L0_key_init(void);
extern void L3_task_key_handle(struct _s_task_key_ *p);
#endif

190
source/app/task_modbus.c

@ -4,178 +4,6 @@
//#include "../tpc/modbus.h" //#include "../tpc/modbus.h"
#include "../app/app_config.h" #include "../app/app_config.h"
U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num)
{
U8 bufsize = 4;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_READ;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = num >> 8 * 0xFF;
pmodbus->buf[3] = num >> 0 & 0xFF;
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2;
}
U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf)
{
U8 bufsize = 4;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = buf[0];
pmodbus->buf[3] = buf[1];
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2;
}
U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf)
{
U8 bufsize = 5,i = 0;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE_M;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = num >> 8 * 0xFF;
pmodbus->buf[3] = num >> 0 & 0xFF;
pmodbus->buf[4] = bytes;
for(i=0;i<bytes;i++)
{
pmodbus->buf[5+i] = buf[i];
}
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes);
pmodbus->buf[bufsize + bytes] = pmodbus->crc[0];
pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1];
return bufsize + bytes + 2 + 2;
}
U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info)
{
switch(slaver_info->oper)
{
case MODBUS_OPER_READ:
return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum);
case MODBUS_OPER_WRITE:
return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf);
case MODBUS_OPER_WRITE_M:
return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf);
default:
return 0;
}
}
U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize)
{
pmodbus->slaver = slaver;
pmodbus->oper = oper;
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2;
}
//MODBUS从设备数据处理函数
static Modbus03Ack *pModbus03Ack;
static Modbus06Ack *pModbus06Ack;
static Modbus10Ack *pModbus10Ack;
static U16 modbuslen = 0,reg,num,val,count;
U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck)
{
switch(pmodbus->oper)
{
case MODBUS_OPER_READ:
case MODBUS_OPER_READCONFIG:
{
U16 i = 0,j = 0,regval = 0;
pModbus03Ack = (Modbus03Ack *)pModbusAck->buf;
reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]);
num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]);
if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界
{
for(i=0; i<num; i++)
{
regval = *(REG_2_MEM(reg + i));
pModbus03Ack->buf[j++] = regval >> 8 & 0xFF;
pModbus03Ack->buf[j++] = regval & 0xFF;
}
pModbus03Ack->bytes = num * 2;
modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1);
}
break;
}
#if 0
case MODBUS_OPER_WRITE:
{
pModbus06Ack = (Modbus06Ack *)pModbusAck->buf;
reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]);
val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]);
if(reg <= sizeof(R)/2)
{
*(REG_2_MEM(reg)) = val;
pModbus06Ack->reg = reg;
pModbus06Ack->val = *(REG_2_MEM(reg));
modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4);
}
break;
}
#endif
case MODBUS_OPER_WRITE_M:
{
U16 i = 0;
pModbus10Ack = (Modbus10Ack *)pModbusAck->buf;
reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]);
num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]);
count = pmodbus->buf[4];
if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界
{
for(i=0; i<num; i++)
{
*(REG_2_MEM(reg + i)) = ((U16)pmodbus->buf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]);
}
pModbus10Ack->reg = reg;
pModbus10Ack->num = num;
modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4);
}
break;
}
default:break;
}
return modbuslen;
}
//MODBUS主设备轮询时,从设备返回数据处理函数
//MD_SLAVER_INFO需要被正确定义
void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info)
{
switch(pmodbus->oper)
{
case MODBUS_OPER_READ:
case MODBUS_OPER_READCONFIG:
{
U8 i = 0;
for(i=0;i<pmodbus->buf[0];i++)
{
//此处假设字节序一致
p_slaver_info->buf[i] = pmodbus->buf[i + 1];
//TODO 字节序不一致时的处理
}
break;
}
case MODBUS_OPER_WRITE:
case MODBUS_OPER_WRITE_M:
default: break;
}
}
void L3_task_modbus_handler(TP_Handler_X *ph4) void L3_task_modbus_handler(TP_Handler_X *ph4)
@ -185,7 +13,7 @@ void L3_task_modbus_handler(TP_Handler_X *ph4)
TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
//LED0 ^= 1; //LED0 ^= 1;
ph4->ok = 0; ph4->ok = 0;
if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机 if(ts_modbus->slaver == G.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机
{ {
U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack);
L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); L0_uart0_sendArray((U8*)&s_uart0_ack, acklen);
@ -205,22 +33,6 @@ void L3_task_modbus_handler(TP_Handler_X *ph4)
#endif #endif
} }
} }
void L3_task_modbus_handler2(TP_Handler_X *ph4)
{
if(s_uart2_rec.ok)
{
TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
//LED0 ^= 1;
s_uart2_rec.ok=0;
L0_uart0_sendArray(s_uart2_rec.buf, s_uart2_rec.num);
}
if(s_uart2_rec.yes)
{
s_uart2_rec.yes=0;
L0_uart0_sendArray(s_uart2_rec.buf, s_uart2_rec.num);
}
}

35
source/app/task_pen_head.c

@ -0,0 +1,35 @@
#include "task_pen_head.h"
struct _s_task_pen_head_ s_task_pen_head;
void L3_task_pen_head_init()
{
L1_task_init(&s_task_pen_head.task);
L3_task_s_go(s_task_pen_head,D_task_init);
}
#define TTSS_TASK_HEAD_DATA_WRITE 0x01
U8 i = 0;
void L3_task_pen_head_handle(struct _s_task_pen_head_ *s)
{
TTSS_Task_init()
L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,0);
TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE)
{
s->point.x_axis = i;
s->point.y_axis = i;
s->point.time = D_sys_now;
i++;
Lc_write_cyc_buf(&s->point,&wr_buf,1);
Lc_buf_full(&wr_buf);
}
L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,D_Tdelay_20ms);
TTSS_Task_end();
}

22
source/app/task_pen_head.h

@ -0,0 +1,22 @@
#ifndef _app_task_pen_head_H
#define _app_task_pen_head_H
#include "../bsp/bsp_config.h"
#include "../bsp/w600.h"
#include "../ctask/task.h"
#include "../tpc/at0d0a.h"
#include "../tpc/ccmodbus.h"
#include "../app/app_config.h"
struct _s_task_pen_head_
{
TS_task task;
vU32 last_write_time;
vU32 now_write_time;
vU32 time_lag;
PenPoint point;
};
extern struct _s_task_pen_head_ s_task_pen_head;
extern void L3_task_pen_head_init();
extern void L3_task_pen_head_handle(struct _s_task_pen_head_ *s);
#endif

8
source/app/task_register.c

@ -36,21 +36,21 @@ void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s)
L2_task_go(D_task_WEIGHT_COUNT); L2_task_go(D_task_WEIGHT_COUNT);
TTSS_Task_step(D_task_WEIGHT_COUNT) TTSS_Task_step(D_task_WEIGHT_COUNT)
if(R.w600_mode == 1) if(G.w600_mode == 1)
{ {
L3_gm35_send_str("+++"); L3_gm35_send_str("+++");
Lc_delay_ms(1000); Lc_delay_ms(1000);
//s_task_gm35_flow.mode=W600_AP; //s_task_gm35_flow.mode=W600_AP;
L3_task_gm35_flow_init(W600_AP); L3_task_gm35_flow_init(W600_AP);
R.w600_mode = 0; G.w600_mode = 0;
} }
L2_task_go(D_task_IAP); //延时100ms L2_task_go(D_task_IAP); //延时100ms
TTSS_Task_step(D_task_IAP) TTSS_Task_step(D_task_IAP)
if(R.status_eep_save != 0) if(G.status_eep_save != 0)
{ {
R.status_eep_save = 0; G.status_eep_save = 0;
L3_reg_2_iap();//写入IAP L3_reg_2_iap();//写入IAP
} }
L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms

157
source/app/task_w600.c

@ -17,8 +17,8 @@
#include "../msp/uart0.h" #include "../msp/uart0.h"
struct _s_task_gm35_gprs_ s_task_gm35_flow; struct _s_task_gm35_gprs_ s_task_gm35_flow;
TS_tcp_control ts_tcp_control; //TS_tcp_control ts_tcp_control;
TS_tcp ts_tcp; //TS_tcp ts_tcp;
@ -48,7 +48,7 @@ void L3_gm35_send_str(U8 *str)
//将数据放入gm35待发送缓冲区 //将数据放入gm35待发送缓冲区
void L3_gm35_send_data(U8 *buf , U8 len) void L3_gm35_send_data(U8 *buf , U8 len)
{ {
L3_gm35_send_str(_cipsend_hex(len)); //L3_gm35_send_str(_cipsend_hex(len));
L0_uart2_sendArray(buf,len); L0_uart2_sendArray(buf,len);
if(G.debug) if(G.debug)
{ {
@ -62,7 +62,7 @@ void L3_gm35_rcv_data(U8* buf,U8 num)
{ {
L0_uart0_sendstr("ATRCV="); L0_uart0_sendstr("ATRCV=");
L0_uart0_uchex(num); L0_uart0_uchex(num);
L0_uart0_sendArray(buf,num); L0_uart0_sendArray(buf,num+3);
} }
} }
@ -170,23 +170,6 @@ void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p)
//------------------------------------------------------ gm35 tasks -------------------------------- //------------------------------------------------------ gm35 tasks --------------------------------
void L3_task_tcp_init(void)
{
L1_task_init(&ts_tcp.task);
L3_task_s_go(ts_tcp,D_task_init);
ts_tcp.slaverIndex = 0;
ts_tcp.pkglen = 0;
ts_tcp.retryTimes = 0;
ts_tcp.ackFlag = 0;
}
void L3_task_tcp_control_init(void)
{
L1_task_init(&ts_tcp_control.task);
L3_task_s_go(ts_tcp_control,D_task_init);
ts_tcp_control.conn_ok_pool = 0;
ts_tcp_control.tcp_send_stmp = 0;
}
void L3_task_gm35_flow_init(U8 mode) void L3_task_gm35_flow_init(U8 mode)
{ {
@ -194,7 +177,7 @@ void L3_task_gm35_flow_init(U8 mode)
L3_task_s_go(s_task_gm35_flow,D_task_init); L3_task_s_go(s_task_gm35_flow,D_task_init);
s_task_gm35_flow.mode = mode; s_task_gm35_flow.mode = mode;
s_task_gm35_flow.send = 0; s_task_gm35_flow.send = 0;
s_task_gm35_flow.conn_ok = 0;
#if 0 #if 0
g_at_send_status.send_lock = 0; g_at_send_status.send_lock = 0;
g_at_send_status.module_ok = 0; g_at_send_status.module_ok = 0;
@ -342,7 +325,6 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->send = 0; s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_3s); L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_3s);
} }
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发 {//超时重发
s->send = 0; s->send = 0;
@ -360,25 +342,39 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->send = 0; s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_3s); L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_3s);
} }
else if(1 == s->st_error)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST,0);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发 {//超时重发
s->send = 0; s->send = 0;
} }
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND) TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPSEND); L3_gm35_send_str(AT_INS_ST_CIPSEND);
s->ins_ok = 0; s->ins_ok = 0;
s->conn_ok = 0; s->st_error = 0;
s->ins_stmp = s_nos_tick.t_1s; s->ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_300ms); s->send = 1;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_500ms);//发完之后要等,不然st_error == 0没用 ,没收到error之前也是=0
}
else if(1 == s->st_error)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,0);
}
else if(0 == s->st_error)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,0);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA) TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA)
//L0_uart2_sendstr("abcdefg"); //L0_uart2_sendstr("abcdefg");
s->conn_ok = 1; s_task_gm35_flow.conn_ok = 1;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_3s); L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_1s);
@ -552,101 +548,4 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
TTSS_Task_end(); TTSS_Task_end();
} }
#define D_task_tcp_constructor_modbus_pkg 0x41
#define D_task_tcp_send_modbus_pkg 0x42
#define D_task_tcp_wait_modbus_ack 0x43
#define D_task_tcp_switch_next_slaver 0x44
void L3_task_tcp_handle(TS_tcp *s)
{
TTSS_Task_init();
L2_task_go(D_task_tcp_constructor_modbus_pkg);
TTSS_Task_step(D_task_tcp_constructor_modbus_pkg) //构造包
if(R.ccmd_slaver_info[s->slaverIndex].mask > 0)
{
s->pkglen = L3_pack_ccmodbus(&s->loopPkg,R.ccmd_slaver_info + s->slaverIndex);
s->ackFlag = 0;
s->retryTimes = 0;
L2_task_go(D_task_tcp_send_modbus_pkg);
}
else
{
L2_task_go(D_task_tcp_switch_next_slaver);
}
TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包
L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen);
s->sendStamp = s_nos_tick.t_1s;
if(R.ccmd_slaver_info[s->slaverIndex].mask == 1)
{
R.ccmd_slaver_info[s->slaverIndex].mask = 0;
}
L2_task_go(D_task_tcp_wait_modbus_ack);
TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack
if(s_uart2_tcp_rec.ok)
{
s_uart2_tcp_rec.ok = 0;
s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s;
s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp);
L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num + 3);
if(s->pAckPkg->slaver == R.ccmd_slaver_info[s->slaverIndex].slaver)
{
s->ackFlag = 1;
}
}
if(s->ackFlag == 1 || s_nos_tick.t_1s - s->sendStamp >= 5) //收到ack或者超时
{
L2_task_go(D_task_tcp_switch_next_slaver);
}
TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个
if(++ s->slaverIndex >= CCMD_SLAVER_INFO_MAX)
{
s->slaverIndex = 0;
}
L2_task_go(D_task_tcp_constructor_modbus_pkg);
TTSS_Task_end();
}
#define D_task_tcp_control_01 0x51
#define D_task_tcp_control_02 0x52
void L3_task_tcp_control_handle(TS_tcp_control *s)
{
TTSS_Task_init();
L2_task_go(D_task_tcp_control_01);
TTSS_Task_step(D_task_tcp_control_01)
if(s->conn_ok_pool != s_task_gm35_flow.conn_ok)
{
s->conn_ok_pool = s_task_gm35_flow.conn_ok;
}
L2_task_go(D_task_tcp_control_02);
TTSS_Task_step(D_task_tcp_control_02)
if(s_task_gm35_flow.conn_ok)
{
//3s一次发送数据包
if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3)
{
R.ccmd_slaver_info[0].mask = 1;
ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s;
}
}
L2_task_go(D_task_tcp_control_01);
TTSS_Task_end();
}
/********************************************************/

39
source/app/task_w600.h

@ -25,7 +25,7 @@
#define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式 #define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式
//#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //网络查询指令 //#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //网络查询指令
#define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //GPRS操作指令 #define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //GPRS操作指令
#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"test.tall.wiki\",49000\r\n" //连接服务器 #define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.83\",4001\r\n" //连接服务器
#define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //发送数据 #define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //发送数据
#define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //主动关闭连接 #define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //主动关闭连接
#define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //查询连接状态 #define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //查询连接状态
@ -55,6 +55,7 @@ struct _s_task_gm35_gprs_
vU8 ap_conn_ok; vU8 ap_conn_ok;
vU8 ap_rec_ok; vU8 ap_rec_ok;
vU8 st_cip_ok; vU8 st_cip_ok;
vU8 st_send_ok;
vU8 ap_tcp_ok; vU8 ap_tcp_ok;
vU8 ap_data_ok; vU8 ap_data_ok;
vU8 st_error; vU8 st_error;
@ -62,9 +63,6 @@ struct _s_task_gm35_gprs_
vU8 send_lock; vU8 send_lock;
vU8 module_ok; vU8 module_ok;
vU8 sim_ok;
vU8 net_ok;
vU8 gprs_ok;
vU8 conn_ok; vU8 conn_ok;
vU8 status_query_ok; vU8 status_query_ok;
vU32 ins_stmp; //指令时间戳 vU32 ins_stmp; //指令时间戳
@ -90,40 +88,18 @@ extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
#define STATUS_GM35_TCP_OK 5 #define STATUS_GM35_TCP_OK 5
#define BUF_SIZE 5 #define BUF_SIZE 5
#define BUF_MAX 32 //注意缓冲区的长度 #define BUF_MAX 32 //注意缓冲区的长度
typedef struct
{
TS_task task;
TS_PH3_ccmodbus loopPkg;
TS_PH3_ccmodbus *pAckPkg;
U8 slaverIndex;
U8 pkglen;
U32 sendStamp;
U8 retryTimes;
U8 ackFlag;
U16 treg;
}TS_tcp;
typedef struct
{
TS_task task;
vU8 conn_ok_pool;
vU32 tcp_send_stmp;
}TS_tcp_control;
extern TS_tcp_control ts_tcp_control;
extern struct _s_task_gm35_gprs_ s_task_gm35_flow; extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
extern TS_tcp ts_tcp;
#define U485_TIMEOUT 3 //3 x 100ms = 300ms
extern TS_tcp ts_tcp;
extern void L3_task_tcp_control_init();
extern void L3_task_tcp_init();
extern struct _s_task_gm35_gprs_ s_task_gm35_flow; extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
extern void L3_gm35_send_str(U8 *str); extern void L3_gm35_send_str(U8 *str);
extern void L3_gm35_send_data(U8 *buf , U8 len);
extern void L3_gm35_rcv_data(U8* buf,U8 num);
extern void L3_task_gm35_flow_init(U8 mode); extern void L3_task_gm35_flow_init(U8 mode);
extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s); extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s);
@ -131,9 +107,6 @@ extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s);
extern void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p); extern void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p);
extern void L3_task_tcp_handle(TS_tcp *s);
extern void L3_task_tcp_control_handle(TS_tcp_control *s);
#endif #endif

8
source/bsp/bsp_config.c

@ -70,6 +70,14 @@ void L0_board_config(void)
D_stdIO_P3(BITN5); D_stdIO_P3(BITN5);
D_stdIO_P3(BITN6); D_stdIO_P3(BITN6);
D_stdIO_P3(BITN7); D_stdIO_P3(BITN7);
D_HighI_P2(BITN7);
D_HighI_P2(BITN6);
//D_HighI_P5(BITN5);
D_HighI_P0(BITN2);
D_OpenD_P5(BITN5);
D_OpenD_P4(BITN0);
D_HighI_P3(BITN4);
D_HighI_P5(BITN0);
#if (TYPE_WDT_ENABLE == D_WDT_STATUS) #if (TYPE_WDT_ENABLE == D_WDT_STATUS)
WDT_CONTR = 0x27; //使能看门狗,22M时钟下溢出时间约为5s,请注意添加喂狗程序 WDT_CONTR = 0x27; //使能看门狗,22M时钟下溢出时间约为5s,请注意添加喂狗程序

8
source/bsp/bsp_config.h

@ -77,7 +77,7 @@
#define D_MCU_NAME "STC8H3K64S4" #define D_MCU_NAME "STC8H3K64S4"
//存储器特殊参数地址配置 //存储器特殊参数地址配置
#define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9
//...其他参数 //...其他参数
//串口配置 //串口配置
@ -115,8 +115,10 @@
//笔头 //笔头
#define SCK P34 #define SCK P34
#define SDIO P50 #define SDIO P50
//按键
#define key1 P32
#define key2 P33
#define key3 P40
//EEP存储地址定义 //EEP存储地址定义
#define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes
#define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 #define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等

3
source/clib/clib.c

@ -96,6 +96,7 @@ void Lc_buf_copy_uc(U8 *dst,U8 *src,U8 len)
} }
} }
vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c)
{ {
if(a > b) if(a > b)
@ -331,7 +332,7 @@ void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/
CRC[1]=wcrc>>8;//crc的高八位 CRC[1]=wcrc>>8;//crc的高八位
} }
#if 0 #if 1
void crc16_irq(unsigned char *CRC,void *dat,unsigned int len) void crc16_irq(unsigned char *CRC,void *dat,unsigned int len)
{ {
unsigned char *ptr = (unsigned char *)dat; unsigned char *ptr = (unsigned char *)dat;

2
source/clib/clib.h

@ -99,7 +99,7 @@ extern void Lc_array_sort(S32 arr[],int n);
/// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' /// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2'
extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii);
extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/;
//extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len);
extern int isBigEndianOrder(void); extern int isBigEndianOrder(void);
extern U32 ntohl(U32 dat); extern U32 ntohl(U32 dat);
extern U32 htonl(U32 dat); extern U32 htonl(U32 dat);

4
source/ctask/tick.h

@ -45,10 +45,14 @@ extern struct _s_nos_tick_ s_nos_tick;
#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) #define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1)
#define D_Tdelay_5ms ((5-1) / JIFFIES + 1) #define D_Tdelay_5ms ((5-1) / JIFFIES + 1)
#define D_Tdelay_10ms ((10-1) / JIFFIES + 1) #define D_Tdelay_10ms ((10-1) / JIFFIES + 1)
#define D_Tdelay_20ms ((20-1) / JIFFIES + 1)
#define D_Tdelay_100ms ((100-1) / JIFFIES + 1) #define D_Tdelay_100ms ((100-1) / JIFFIES + 1)
#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) #define D_Tdelay_200ms ((200-1) / JIFFIES+ 1)
#define D_Tdelay_300ms ((300-1) / JIFFIES + 1) #define D_Tdelay_300ms ((300-1) / JIFFIES + 1)
#define D_Tdelay_400ms ((400-1) / JIFFIES + 1) #define D_Tdelay_400ms ((400-1) / JIFFIES + 1)
#define D_Tdelay_500ms ((500-1) / JIFFIES + 1)
#define D_Tdelay_1s (1 * HZ) #define D_Tdelay_1s (1 * HZ)
#define D_Tdelay_2s (2 * HZ) #define D_Tdelay_2s (2 * HZ)
#define D_Tdelay_3s (3 * HZ) #define D_Tdelay_3s (3 * HZ)

21
source/msp/UART0.C

@ -127,7 +127,7 @@ void INTERRUPT_UART(void) D_SERVE_UART
{ {
// LED0 ^= 1; // LED0 ^= 1;
L0_uart0_IntRIClear(); //清除接收中断标志 L0_uart0_IntRIClear(); //清除接收中断标志
ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); ts_uart[uNum0].t->reg = SBUF;
//ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t);
L1_s2b_PH4(ts_uart[uNum0].t); L1_s2b_PH4(ts_uart[uNum0].t);
L0_timer3_restart(); L0_timer3_restart();
@ -138,7 +138,8 @@ void INTERRUPT_UART(void) D_SERVE_UART
L0_uart0_IntTIClear(); //清除发送中断标志 L0_uart0_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now)
{ {
L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); SBUF = ts_uart[uNum0].p->p[ts_uart[uNum0].p->now];
//L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]);
ts_uart[uNum0].p->now ++; ts_uart[uNum0].p->now ++;
} }
else else
@ -157,11 +158,10 @@ void INTERRUPT_UART(void) D_SERVE_UART
void timer3_isrHanddle(void) D_SERVE_TIMER3 void timer3_isrHanddle(void) D_SERVE_TIMER3
{ {
struct _tp_handler_x *p1 = &s_uart0_rec; struct _tp_handler_x *p1 = &s_uart0_rec;
struct _tp_handler_x *p2 = &s_uart2_rec;
if((p1->head == 1) && (p1->num >= D_s_modbus_min)) if((p1->head == 1) && (p1->num >= D_s_modbus_min))
{ {
p1->head = 0; p1->head = 0;
crc16(p1->crc,p1->buf,p1->num - 2); //校验CRC crc16_irq(p1->crc,p1->buf,p1->num - 2); //校验CRC
if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1]) if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1])
{ {
p1->ok = 1; p1->ok = 1;
@ -172,19 +172,6 @@ void timer3_isrHanddle(void) D_SERVE_TIMER3
p1->yes = 1; p1->yes = 1;
} }
} }
if((p2->head == 1) && (p2->num >= D_s_modbus_min))
{
p2->head = 0;
crc16(p2->crc,p2->buf,p2->num - 2); //校验CRC
if(p2->crc[0] == p2->buf[p2->num-2] && p2->crc[1] == p2->buf[p2->num-1])
{
p2->ok = 1;
}
else
{
p2->yes = 1;
}
}
L0_timer3_stop(); L0_timer3_stop();
} }

46
source/msp/UART2.C

@ -61,10 +61,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
//#define _USE_485 //#define _USE_485
static volatile Ts_uart_send_buf idata ts_uart_send_shop; static volatile Ts_uart_send_buf idata ts_uart_send_shop;
TP_Handler_X s_uart2_rec; //TP_Handler_X s_uart2_rec;
TS_PH4_modbus s_uart2_ack; //TS_PH4_modbus s_uart2_ack;
struct _s_PC1_0D0A_ s_uart2_at; struct _s_PC1_0D0A_ s_uart2_at;
TS_Handle_PH3 s_uart2_tcp_rec; TS_Handle_PH3 s_uart2_tcp_rec;
void (*Lp0_uart2_fun)(unsigned char sbufreg);
void L0_uart2_init(void) void L0_uart2_init(void)
{ {
@ -84,14 +85,18 @@ void L0_uart2_buf_init(void)
ts_uart[uNum2].p = &ts_uart_send_shop; ts_uart[uNum2].p = &ts_uart_send_shop;
ts_uart[uNum2].p->now = 0; ts_uart[uNum2].p->now = 0;
ts_uart[uNum2].p->ok = D_ready; ts_uart[uNum2].p->ok = D_ready;
ts_uart[uNum2].t = &s_uart2_rec; //ts_uart[uNum2].t = &s_uart2_rec;
ts_uart[uNum2].t->head = 0; ts_uart[uNum2].t->head = 0;
ts_uart[uNum2].t->ok = 0; ts_uart[uNum2].t->ok = 0;
ts_uart[uNum2].tp_handler = NULL; ts_uart[uNum2].tp_handler = NULL;
ts_uart[uNum2].ack = (U8*)&s_uart2_ack; //ts_uart[uNum2].ack = (U8*)&s_uart2_ack;
L0_uart2_init(); L0_uart2_init();
D_uart2_ES_INT(1); //打开串口中断 D_uart2_ES_INT(1); //打开串口中断
//配置串口对应的操作协议
L1_uart_tpc_config();
#if (D_UART2_485_TYPE != TYPE_485_NONE) #if (D_UART2_485_TYPE != TYPE_485_NONE)
D_UART2_485_RX() //默认处于接收状态 D_UART2_485_RX() //默认处于接收状态
#endif #endif
@ -104,6 +109,28 @@ void L0_uart2_sendArray(U8 * buf, U16 len)
#endif #endif
L0_uartN_sendArray(uNum2,buf,len); L0_uartN_sendArray(uNum2,buf,len);
} }
void L1_s2b_gm35(unsigned char sbufreg)
{
s_uart2_tcp_rec.reg = sbufreg;
L1_s2b_PH3(&s_uart2_tcp_rec);
if(0 == s_uart2_tcp_rec.head)
{
s_uart2_at.reg = sbufreg;
L1_s2b_0d0a(&s_uart2_at);
}
else
{
s_uart2_at.head = 0;
}
}
void L1_uart_tpc_config(void)
{
s_uart2_tcp_rec.head = 0;
s_uart2_tcp_rec.ok = 0;
s_uart2_tcp_rec.head_0 = D_CMD_Filter1_ff;
s_uart2_tcp_rec.head_1 = D_CMD_Filter2_fe;
s_uart2_tcp_rec.sp = (U8*)&(s_uart2_tcp_rec.ts_ccmodbus);
}
/************************************************* /*************************************************
UART UART
@ -114,20 +141,21 @@ void INTERRUPT_uart2(void) D_SERVE_uart2// using 2
//NOP(); NOP(); NOP(); //NOP(); NOP(); NOP();
if(L0_uart2_IntRI()) //如果是U2接收中断 if(L0_uart2_IntRI()) //如果是U2接收中断
{ {
//LED0 ^= 1; //LED1 ^= 1;
L0_uart2_IntRIClear(); //清除接收中断标志 L0_uart2_IntRIClear(); //清除接收中断标志
//ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); //ts_uart[uNum2].t->reg = L0_uartN_get(uNum2);
//ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); //ts_uart[uNum2].tp_handler(ts_uart[uNum2].t);
s_uart2_at.reg = L0_uartN_get(uNum2); //s_uart2_at.reg = L0_uartN_get(uNum2);
L1_s2b_0d0a(&s_uart2_at); //L1_s2b_0d0a(&s_uart2_at);
L0_timer3_restart(); L1_s2b_gm35(L0_uart2_get());
} }
if(L0_uart2_IntTI()) //如果是U0发送中断 if(L0_uart2_IntTI()) //如果是U0发送中断
{ {
L0_uart2_IntTIClear(); //清除发送中断标志 L0_uart2_IntTIClear(); //清除发送中断标志
if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now)
{ {
L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); S2BUF = ts_uart[uNum2].p->p[ts_uart[uNum2].p->now];
//L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]);
ts_uart[uNum2].p->now ++; ts_uart[uNum2].p->now ++;
} }
else else

12
source/msp/UART2.h

@ -56,9 +56,9 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
#include "../bsp/bsp_config.h" #include "../bsp/bsp_config.h"
#include "../tpc/at0d0a.h" #include "../tpc/at0d0a.h"
#include "../tpc/ccmodbus.h" #include "../tpc/modbus.h"
#include "uart_x.h" #include "uart_x.h"
#include "../tpc/ccmodbus.h"
#define uNum2 1 #define uNum2 1
@ -67,6 +67,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) #define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI)
#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) #define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI)
#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) #define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI)
#define L0_uart2_get() (S2BUF)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@ -81,10 +82,13 @@ void uart2_Handdle(void);
#define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) #define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X)
#define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) #define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X)
#define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) #define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf)
extern TP_Handler_X s_uart2_rec; //extern TP_Handler_X s_uart2_rec;
extern TS_PH4_modbus s_uart2_ack; //extern TS_PH4_modbus s_uart2_ack;
extern TS_Handle_0d0a s_uart2_at; extern TS_Handle_0d0a s_uart2_at;
extern TS_Handle_PH3 s_uart2_tcp_rec; extern TS_Handle_PH3 s_uart2_tcp_rec;
extern void (*Lp0_uart2_fun)(unsigned char sbufreg);
extern void L1_uart_tpc_config(void);
#endif //#ifndef _uart2_H #endif //#ifndef _uart2_H

7
source/tpc/at0d0a.c

@ -25,8 +25,13 @@ void L1_s2b_0d0a(struct _s_PC1_0D0A_ *p)// reentrant
{ {
if(1 != p->ok) if(1 != p->ok)
{ {
U8 i = 0;
p->buf[0] = p->num - 2; //去掉0d0a p->buf[0] = p->num - 2; //去掉0d0a
Lc_buf_copy_uc(p->buf + 1,p->__buf,p->num-2); //Lc_buf_copy_uc(p->buf + 1,p->__buf,p->num-2);
for(i=0;i<p->num-2;i++)
{
p->buf[1+i] = p->__buf[i];
}
p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文
} }
} }

149
source/tpc/ccmodbus.c

@ -30,10 +30,10 @@ msp/uartx.c 底层代码 和cpu相关
********************************************************************************/ ********************************************************************************/
#include "ccmodbus.h" #include "ccmodbus.h"
#include "modbus.h"
#include "../clib/clib.h" #include "../clib/clib.h"
vU8 D_CMD_Filter1_ff; #include "../app/app_config.h"
vU8 D_CMD_Filter2_fe;
#if 0
U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num)
{ {
U8 bufsize = 4; U8 bufsize = 4;
@ -49,7 +49,6 @@ U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num)
return bufsize + 2 + 2; return bufsize + 2 + 2;
} }
U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf)
{ {
U8 bufsize = 4; U8 bufsize = 4;
@ -66,9 +65,11 @@ U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf)
return bufsize + 2 + 2; return bufsize + 2 + 2;
} }
U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf,U16 extra_num)
{ {
U8 bufsize = 5,i = 0; U8 bufsize = 5,i = 0;
num += extra_num;
bytes = num*2;
pmodbus->slaver = slaverId; pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE_M; pmodbus->oper = MODBUS_OPER_WRITE_M;
pmodbus->buf[0] = reg >> 8 & 0xFF; pmodbus->buf[0] = reg >> 8 & 0xFF;
@ -87,31 +88,33 @@ U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num,
return bufsize + bytes + 2 + 2; return bufsize + bytes + 2 + 2;
} }
#endif
U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) U8 L3_pack_ccmodbus_90(TS_PH3_ccmodbus *pmodbus ,U8 slaverId)
{ {
U8 bufsize = 4; U8 bufsize = 12,i = 0,j = 0;
pmodbus->slaver = slaverId; pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_READ; pmodbus->oper = MODBUS_OPER_AUTH;
pmodbus->buf[0] = reg >> 8 & 0xFF; pmodbus->buf[0] = APP_VERSION_HEX >> 4 & 0xF; //major version
pmodbus->buf[1] = reg >> 0 & 0xFF; pmodbus->buf[1] = APP_VERSION_HEX >> 0 & 0xF; //minor version
pmodbus->buf[2] = num >> 8 * 0xFF; pmodbus->buf[2] = 0x00; //mq high
pmodbus->buf[3] = num >> 0 & 0xFF; pmodbus->buf[3] = 0x04; //mq low
pmodbus->buf[4] = 0x00; //
for(i=5;i<bufsize;i++)
{
pmodbus->buf[i] = G.mcu_id[j];
j++;
}
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0]; pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2; return bufsize + 2 + 2;
} }
U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) U8 L3_pack_ccmodbus_92(TS_PH3_ccmodbus *pmodbus ,U8 slaverId)
{ {
U8 bufsize = 4; U8 bufsize = 7;
pmodbus->slaver = slaverId; pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE; pmodbus->oper = MODBUS_OPER_PING;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = buf[0];
pmodbus->buf[3] = buf[1];
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0]; pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
@ -119,36 +122,11 @@ U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf)
return bufsize + 2 + 2; return bufsize + 2 + 2;
} }
U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info)
{
U8 bufsize = 5,i = 0;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE_M;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = num >> 8 * 0xFF;
pmodbus->buf[3] = num >> 0 & 0xFF;
pmodbus->buf[4] = bytes;
for(i=0;i<bytes;i++)
{
pmodbus->buf[5+i] = buf[i];
}
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes);
pmodbus->buf[bufsize + bytes] = pmodbus->crc[0];
pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1];
return bufsize + bytes + 2 + 2;
}
#if 0
U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info)
{ {
U8 pkglen = 0;
pccmodbus->filter1 = D_CMD_Filter1_ff; pccmodbus->filter1 = D_CMD_Filter1_ff;
pccmodbus->filter2 = D_CMD_Filter2_fe; pccmodbus->filter2 = D_CMD_Filter2_fe;
pccmodbus->num = L3_pack_modbus((TS_PH4_modbus*)&pccmodbus->slaver, slaver_info);
switch(slaver_info->oper) switch(slaver_info->oper)
{ {
case MODBUS_OPER_READ: case MODBUS_OPER_READ:
@ -157,17 +135,21 @@ U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info)
case MODBUS_OPER_WRITE: case MODBUS_OPER_WRITE:
pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf);
break; break;
case MODBUS_OPER_WRITE_M: case MODBUS_OPER_WRITE_M://组包时加extra_num
pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf,slaver_info->extra_num);
break;
case MODBUS_OPER_AUTH:
pkglen = L3_pack_ccmodbus_90(pccmodbus,slaver_info->slaver);
break;
case MODBUS_OPER_PING:
pkglen = L3_pack_ccmodbus_92(pccmodbus,slaver_info->slaver);
break; break;
default: default:
break; break;
} }
pccmodbus->num = pkglen; pccmodbus->num = pkglen;
return pkglen + 3;
return pccmodbus->num + 3;
} }
#endif
U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck) U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck)
{ {
@ -186,7 +168,7 @@ void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slave
///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) ///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
/// 0 1 2 3 4 5 6 7 8 9 10 /// 0 1 2 3 4 5 6 7 8 9 10
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F /// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant
{ {
p->cashe[1] = p->cashe[0]; p->cashe[1] = p->cashe[0];
p->cashe[0] = p->reg;// p->cashe[0] = p->reg;//
@ -195,66 +177,47 @@ void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant
{ {
if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1))
{ {
LED1 ^= 1;
p->head = 1; p->head = 1;
p->max = D_TPC_HANDLER_X_LEN ; p->max = D_s_PH3_ccmodbus_max - 1;
p->sp = p->buf; p->sp = (unsigned char *)&(p->ts_ccmodbus);
p->num = 0; p->sp[0] = p->head_0;
p->sp[p->num++] = p->head_0; p->sp[1] = p->head_1;
p->sp[p->num++] = p->head_1; p->num = 1;
//p->ok = 1;
} }
} }
else else
{ {
p->sp[p->num++] = p->cashe[0]; p->num ++;
if(p->num == 3)//数量 第3个数据 p->sp[p->num] = p->cashe[0];
if(p->num == 2)//数量 第3个数据
{ {
p->max = p->cashe[0] + 3; p->max = p->reg + 2;//
if((p->max > D_TPC_HANDLER_X_LEN ) || (p->max < D_s_ccmodbus_min)) if(p->max >= D_s_PH3_ccmodbus_max)
{ {
p->head = 0; p->max = D_s_PH3_ccmodbus_max - 1;
return; //error 超过最大长度 p->sp[p->num] = p->max - 2;
} }
} }
if(p->num >= p->max) if(p->num >= p->max)
{ {
crc16(p->crc,p->buf + 3,p->num - 3 - 2); //crc16(p->crc,&p->ts_ccmodbus.slaver,p->ts_ccmodbus.num - 2);
if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) //if(p->crc[0] == p->sp[p->num-1] && p->crc[1] == p->sp[p->num])
if(1)
{ {
if (p->ok != 1) if (p->ok != 1)
{ {
//byte_copy_uc((U8*)&p->ts_ccmodbus,(U8*)&p->__ts_ccmodbus,p->max + 1);
p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文
} }
} }
p->num = 0; //放在if (p->ok != 1) 外
p->head = 0; //放在if (p->ok != 1) 外 p->head = 0; //放在if (p->ok != 1) 外
} }
} }
}
U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info)
{
U8 pkglen = 0;
pccmodbus->filter1 = D_CMD_Filter1_ff;
pccmodbus->filter2 = D_CMD_Filter2_fe;
switch(slaver_info->oper)
{
case MODBUS_OPER_READ:
pkglen = L3_pack_ccmodbus_03(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum);
break;
case MODBUS_OPER_WRITE:
pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf);
break;
case MODBUS_OPER_WRITE_M:
pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf);
break;
default:
break;
}
pccmodbus->num = pkglen;
return pkglen + 3;
} }
/******************************************************************************/
/******************************************************************************
** End Of File
******************************************************************************/

25
source/tpc/ccmodbus.h

@ -50,11 +50,11 @@ msp/uartx.c 底层代码 和cpu相关
#ifndef __TPC_CCMODBUS_H_ #ifndef __CCMODBUS_H_
#define __TPC_CCMODBUS_H_ #define __CCMODBUS_H_
#include "../clib/type.h"
#include "tpc_x.h" #include "../tpc/tpc_x.h"
#include "modbus.h" //#include "../app/app_config.h"
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 /// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议
@ -64,8 +64,9 @@ msp/uartx.c 底层代码 和cpu相关
#define D_s_PH3_ccmodbus_max 128 #define D_s_PH3_ccmodbus_max 128
#define D_s_ccmodbus_min (D_s_modbus_min + 3) #define D_s_ccmodbus_min (D_s_modbus_min + 3)
extern vU8 D_CMD_Filter1_ff; #define D_CMD_Filter1_ff 0xFF
extern vU8 D_CMD_Filter2_fe; #define D_CMD_Filter2_fe 0xFE
typedef struct typedef struct
{//8byte {//8byte
vU8 filter1; vU8 filter1;
@ -103,13 +104,13 @@ typedef struct
U16 bytes; U16 bytes;
U8 *buf; U8 *buf;
U16 mask; U16 mask;
U16 extra_num;
}CCMD_SLAVER_INFO; }CCMD_SLAVER_INFO;
extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info);
extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info); //extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck);
extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); //extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info);
extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant;
extern void L1_s2b_PH3(struct _tp_handler_x *p);// reentrant;
#endif /* end __TPC_CCMODBUS_H_ */ #endif /* end __TPC_CCMODBUS_H_ */

178
source/tpc/modbus.c

@ -30,10 +30,188 @@ msp/uartx.c 底层代码 和cpu相关
********************************************************************************/ ********************************************************************************/
#include "modbus.h" #include "modbus.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h" #include "../bsp/bsp_config.h"
#include "../ctask/tick.h" #include "../ctask/tick.h"
#include "../clib/clib.h" #include "../clib/clib.h"
U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num)
{
U8 bufsize = 4;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_READ;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = num >> 8 * 0xFF;
pmodbus->buf[3] = num >> 0 & 0xFF;
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2;
}
U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf)
{
U8 bufsize = 4;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = buf[0];
pmodbus->buf[3] = buf[1];
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2;
}
U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf)
{
U8 bufsize = 5,i = 0;
pmodbus->slaver = slaverId;
pmodbus->oper = MODBUS_OPER_WRITE_M;
pmodbus->buf[0] = reg >> 8 & 0xFF;
pmodbus->buf[1] = reg >> 0 & 0xFF;
pmodbus->buf[2] = num >> 8 * 0xFF;
pmodbus->buf[3] = num >> 0 & 0xFF;
pmodbus->buf[4] = bytes;
for(i=0;i<bytes;i++)
{
pmodbus->buf[5+i] = buf[i];
}
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes);
pmodbus->buf[bufsize + bytes] = pmodbus->crc[0];
pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1];
return bufsize + bytes + 2 + 2;
}
U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info)
{
switch(slaver_info->oper)
{
case MODBUS_OPER_READ:
return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum);
case MODBUS_OPER_WRITE:
return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf);
case MODBUS_OPER_WRITE_M:
return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf);
default:
return 0;
}
}
U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize)
{
pmodbus->slaver = slaver;
pmodbus->oper = oper;
crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize);
pmodbus->buf[bufsize] = pmodbus->crc[0];
pmodbus->buf[bufsize + 1] = pmodbus->crc[1];
return bufsize + 2 + 2;
}
//MODBUS从设备数据处理函数
static Modbus03Ack *pModbus03Ack;
static Modbus06Ack *pModbus06Ack;
static Modbus10Ack *pModbus10Ack;
static U16 modbuslen = 0,reg,num,val,count;
U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck)
{
switch(pmodbus->oper)
{
case MODBUS_OPER_READ:
case MODBUS_OPER_READCONFIG:
{
U16 i = 0,j = 0,regval = 0;
pModbus03Ack = (Modbus03Ack *)pModbusAck->buf;
reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]);
num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]);
if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界
{
for(i=0; i<num; i++)
{
regval = *(REG_2_MEM(reg + i));
pModbus03Ack->buf[j++] = regval >> 8 & 0xFF;
pModbus03Ack->buf[j++] = regval & 0xFF;
}
pModbus03Ack->bytes = num * 2;
modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1);
}
break;
}
#if 0
case MODBUS_OPER_WRITE:
{
pModbus06Ack = (Modbus06Ack *)pModbusAck->buf;
reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]);
val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]);
if(reg <= sizeof(R)/2)
{
*(REG_2_MEM(reg)) = val;
pModbus06Ack->reg = reg;
pModbus06Ack->val = *(REG_2_MEM(reg));
modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4);
}
break;
}
#endif
case MODBUS_OPER_WRITE_M:
{
U16 i = 0;
pModbus10Ack = (Modbus10Ack *)pModbusAck->buf;
reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]);
num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]);
count = pmodbus->buf[4];
if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界
{
for(i=0; i<num; i++)
{
*(REG_2_MEM(reg + i)) = ((U16)pmodbus->buf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]);
}
pModbus10Ack->reg = reg;
pModbus10Ack->num = num;
modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4);
}
break;
}
default:break;
}
return modbuslen;
}
//MODBUS主设备轮询时,从设备返回数据处理函数
//MD_SLAVER_INFO需要被正确定义
void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info)
{
switch(pmodbus->oper)
{
case MODBUS_OPER_READ:
case MODBUS_OPER_READCONFIG:
{
U8 i = 0;
for(i=0;i<pmodbus->buf[0];i++)
{
//此处假设字节序一致
p_slaver_info->buf[i] = pmodbus->buf[i + 1];
//TODO 字节序不一致时的处理
}
break;
}
case MODBUS_OPER_WRITE:
case MODBUS_OPER_WRITE_M:
default: break;
}
}
//MODBUS协议解析函数 //MODBUS协议解析函数
//超出D_tp_handle_x_len,不继续保存数据 //超出D_tp_handle_x_len,不继续保存数据
void L1_s2b_PH4(struct _tp_handler_x *p) void L1_s2b_PH4(struct _tp_handler_x *p)

2
source/tpc/modbus.h

@ -38,6 +38,8 @@ enum MODBUS_OPER
MODBUS_OPER_WRITE = 0x06, MODBUS_OPER_WRITE = 0x06,
MODBUS_OPER_WRITE_M = 0x10, MODBUS_OPER_WRITE_M = 0x10,
MODBUS_OPER_ERR = 0x8F, MODBUS_OPER_ERR = 0x8F,
MODBUS_OPER_AUTH = 0x90,
MODBUS_OPER_PING = 0x92,
}; };
//协议类型: MODBUS RTU模式 //协议类型: MODBUS RTU模式

Loading…
Cancel
Save