28 changed files with 759 additions and 230 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,93 @@ |
|||
#include "app_task_tcp.h" |
|||
#include "../msp/uart0.h" |
|||
#include "../msp/uart4.h" |
|||
#include "../app/app_common.h" |
|||
|
|||
#define MODBUS_SLAVER_DW20_REG_START 0x02 |
|||
#define MODBUS_SLAVER_DW20_REG_NUM 0x02 |
|||
#define MODBUS_SLAVER_RETRY_MAX_TIME 3 |
|||
|
|||
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) |
|||
L0_uart4_sendArray((U8*)&s->loopPkg,s->pkglen); |
|||
s->sendStamp = s_nos_tick.t_5ms; |
|||
L2_task_go(D_task_tcp_wait_modbus_ack); |
|||
|
|||
TTSS_Task_step(D_task_tcp_wait_modbus_ack) |
|||
if(s_nos_tick.t_5ms - s->sendStamp >= 20) |
|||
{ |
|||
if(s_uart4_tcp_rec.ok) |
|||
{ |
|||
s_uart4_tcp_rec.ok = 0; |
|||
s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart4_tcp_rec.sp); |
|||
if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) |
|||
{ |
|||
s->ackFlag = 1; |
|||
if(s->pAckPkg->slaver == G.ccmd_slaver_info[0].slaver && s->pAckPkg->oper == MODBUS_OPER_READ) |
|||
{ |
|||
G.total_weight = |
|||
(S32)(s->pAckPkg->buf[1]) << 24 | (S32)(s->pAckPkg->buf[2]) << 16 | (S32)(s->pAckPkg->buf[3]) << 8 |
|||
| (S32)(s->pAckPkg->buf[4]); |
|||
} |
|||
} |
|||
} |
|||
s->retryTimes++; |
|||
if(s->ackFlag || s->retryTimes >= MODBUS_SLAVER_RETRY_MAX_TIME) |
|||
{ |
|||
if(G.ccmd_slaver_info[s->slaverIndex].mask == 1) |
|||
{ |
|||
G.ccmd_slaver_info[s->slaverIndex].mask = 0; |
|||
} |
|||
L2_task_go(D_task_tcp_switch_next_slaver); |
|||
} |
|||
else |
|||
{ |
|||
L2_task_go(D_task_tcp_send_modbus_pkg); |
|||
} |
|||
} |
|||
|
|||
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(); |
|||
} |
|||
|
|||
|
@ -0,0 +1,26 @@ |
|||
#ifndef APP_TASK_TCP |
|||
#define APP_TASK_TCP |
|||
|
|||
#include "../ctask/task.h" |
|||
#include "../tpc/tpc_ccmodbus.h" |
|||
#include "app_common.h" |
|||
|
|||
typedef struct |
|||
{ |
|||
TS_task task; |
|||
TS_PH3_ccmodbus loopPkg; |
|||
TS_PH3_ccmodbus *pAckPkg; |
|||
U8 slaverIndex; |
|||
U8 pkglen; |
|||
U32 sendStamp; |
|||
U8 retryTimes; |
|||
U8 ackFlag; |
|||
}TS_tcp; |
|||
|
|||
#define U485_TIMEOUT 3 //3 x 100ms = 300ms
|
|||
extern TS_tcp ts_tcp; |
|||
|
|||
extern void L3_task_tcp_init(); |
|||
extern void L3_task_tcp_handle(TS_tcp *s); |
|||
|
|||
#endif |
@ -0,0 +1,56 @@ |
|||
#include "app_task_tcp_control.h" |
|||
#include "../msp/uart0.h" |
|||
#include "../app/app_common.h" |
|||
#include "../app/app_task_gm35.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 |
|||
|
|||
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 != g_at_send_status.conn_ok) |
|||
{ |
|||
if(g_at_send_status.conn_ok) |
|||
{ |
|||
//发送认证包
|
|||
G.ccmd_slaver_info[0].mask = 1; |
|||
|
|||
//发送流程开始包
|
|||
if(G.flowStart == 0) |
|||
{ |
|||
G.flowStart = 1; |
|||
G.ccmd_slaver_info[2].mask = 1; |
|||
} |
|||
ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; |
|||
} |
|||
s->conn_ok_pool = g_at_send_status.conn_ok; |
|||
} |
|||
|
|||
if(s->conn_ok_pool) |
|||
{ |
|||
if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 4) |
|||
{ |
|||
G.ccmd_slaver_info[3].mask = 1; |
|||
ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; |
|||
} |
|||
} |
|||
|
|||
L2_task_go(D_task_tcp_control_01); |
|||
|
|||
TTSS_Task_end(); |
|||
} |
|||
|
|||
|
@ -0,0 +1,20 @@ |
|||
#ifndef APP_TASK_TCP_CONTROL |
|||
#define APP_TASK_TCP_CONTROL |
|||
|
|||
#include "../ctask/task.h" |
|||
#include "../tpc/tpc_ccmodbus.h" |
|||
#include "app_common.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(); |
|||
extern void L3_task_tcp_control_handle(TS_tcp_control *s); |
|||
|
|||
#endif |
@ -0,0 +1,168 @@ |
|||
|
|||
/*****************************************************************************
|
|||
update by cc @201501101001 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
uartcom/uartlib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/uartcom0 |
|||
和uart相关的通讯协议 com + n |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 |
|||
公用的串口通讯定义 |
|||
struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ |
|||
void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 |
|||
L0_UART0_Init |
|||
UART0_IRQHandler |
|||
L0_Usend_uc----------s_at0 |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
|
|||
#include "tpc_ccmodbus.h" |
|||
#include "../clib/clib.h" |
|||
|
|||
U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *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_ccmodbus_06(TS_PH3_ccmodbus *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_ccmodbus_10(TS_PH3_ccmodbus *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_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; |
|||
} |
|||
|
|||
|
|||
///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
|
|||
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
|
|||
void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant
|
|||
{ |
|||
p->cashe[1] = p->cashe[0]; |
|||
p->cashe[0] = p->reg;//
|
|||
|
|||
if (0 == p->head) |
|||
{ |
|||
if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) |
|||
{ |
|||
p->head = 1; |
|||
p->max = D_s_PH3_ccmodbus_max - 1; |
|||
p->sp = (unsigned char *)&(p->ts_ccmodbus); |
|||
p->sp[0] = p->head_0; |
|||
p->sp[1] = p->head_1; |
|||
p->num = 1; |
|||
//p->ok = 1;
|
|||
} |
|||
}else |
|||
{ |
|||
p->num ++; |
|||
p->sp[p->num] = p->cashe[0]; |
|||
if(p->num == 2)//数量 第3个数据
|
|||
{ |
|||
p->max = p->reg + 2;//
|
|||
if(p->max >= D_s_PH3_ccmodbus_max) |
|||
{ |
|||
p->max = D_s_PH3_ccmodbus_max - 1; |
|||
p->sp[p->num] = p->max - 2; |
|||
} |
|||
} |
|||
if(p->num >= p->max) |
|||
{ |
|||
crc16(p->crc,&p->ts_ccmodbus.slaver,p->ts_ccmodbus.num - 2); |
|||
if(/*p->crc[0] == p->ts_ccmodbus.crc[1] && p->crc[1] == p->ts_ccmodbus.crc[0]*/ 1) |
|||
{ |
|||
if (p->ok != 1) |
|||
{ |
|||
//byte_copy_uc((U8*)&p->ts_ccmodbus,(U8*)&p->__ts_ccmodbus,p->max + 1);
|
|||
p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文
|
|||
} |
|||
} |
|||
p->num = 0; //放在if (p->ok != 1) 外
|
|||
p->head = 0; //放在if (p->ok != 1) 外
|
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
/******************************************************************************
|
|||
** End Of File |
|||
******************************************************************************/ |
@ -0,0 +1,113 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2018, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file tpc_fsk.c
|
|||
/// @brief transaction protocol control of fsk
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// @version 1.2 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20180308
|
|||
/// @info 整理
|
|||
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
/*****************************************************************************
|
|||
@version 1.2 |
|||
update by cc @201501101001 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/uartlib.c: |
|||
公用的函数 和硬件无关 |
|||
接收各类协议的处理函数 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
|
|||
|
|||
----------------------------------------------------------------------------------------- |
|||
|
|||
|
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 |
|||
L0_UART0_Init |
|||
UART0_IRQHandler |
|||
L0_Usend_uc----------s_at0 |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
|
|||
|
|||
|
|||
#ifndef __TPC_CCMODBUS_H_ |
|||
#define __TPC_CCMODBUS_H_ |
|||
|
|||
#include "../clib/Type.h" |
|||
|
|||
#define D_CMD_Filter1_ff 0xFF |
|||
#define D_CMD_Filter2_fe 0xFE |
|||
|
|||
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|||
///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|||
/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议
|
|||
///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F )
|
|||
/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F
|
|||
/// 校验码的范围为
|
|||
|
|||
#define D_s_PH3_ccmodbus_max 64 |
|||
#define D_s_PH3_ccmodbus_min 4 |
|||
|
|||
typedef struct |
|||
{//8byte
|
|||
vU8 filter1; |
|||
vU8 filter2; |
|||
vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围
|
|||
vU8 slaver; //发送方的地址或命令
|
|||
vU8 oper; //命令
|
|||
vU8 buf[D_s_PH3_ccmodbus_max-2];//--->_s_P_pc_dat_
|
|||
vU8 crc[2]; //crc16
|
|||
}TS_PH3_ccmodbus; |
|||
|
|||
typedef struct |
|||
{//8byte
|
|||
vU8 cashe[2]; |
|||
vU8 reg; |
|||
vU8 max; //接收到的数目的最大值
|
|||
vU8 head_0; |
|||
vU8 head_1; |
|||
vU8 head; //接收标志头标志
|
|||
vU8 ok; //接收协议ok标志
|
|||
vU8 num; |
|||
vU8 *sp; |
|||
TS_PH3_ccmodbus ts_ccmodbus; |
|||
vU8 crc[2]; |
|||
}TS_Handle_PH3; |
|||
|
|||
typedef struct |
|||
{ |
|||
U16 slaver; |
|||
U16 oper; |
|||
U16 reg; |
|||
U16 regnum; |
|||
U16 bytes; |
|||
U8 *buf; |
|||
U16 mask; |
|||
}CCMD_SLAVER_INFO; |
|||
|
|||
extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info); |
|||
extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant;
|
|||
|
|||
#endif /* end __TPC_CCMODBUS_H_ */ |
|||
|
Loading…
Reference in new issue