/*
* readplc.c
*
* Created on: 2017-1-4
* Author: wzm
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <wait.h>
#include <errno.h>
#include <time.h>
#include <pthread.h>
#include <termios.h>
#include <sys/mman.h>
#include <sys/reboot.h>
#include <sys/time.h>
#include "lib3762.h"
#include "readplc.h"
#include "cjdeal.h"
#include "cjsave.h"
#include "dlt645.h"
#include "dlt698.h"
#include "dlt698def.h"
static OAD OAD_PORT_ZB={0xF209,0x02,0x01};
extern ProgramInfo* JProgramInfo;
extern int SaveOADData(INT8U taskid,OAD oad_m,OAD oad_r,INT8U *databuf,int datalen,TS ts_res);
extern INT16U data07Tobuff698(FORMAT07 Data07,INT8U* dataContent);
extern INT16U data97Tobuff698(FORMAT97 Data97,INT8U* dataContent);
extern INT8U increase6035Value(INT8U taskID,INT8U type);
extern INT8S OADMap07DI(OI_698 roadOI,OAD sourceOAD, C601F_645* flag645);
extern void DbgPrintToFile1(INT8U comport,const char *format,...);
extern void DbPrt1(INT8U comport,char *prefix, char *buf, int len, char *suffix);
extern INT8U checkMeterType(MY_MS mst,INT8U usrType,TSA usrAddr);
extern INT16S composeProtocol698_GetRequest(INT8U* sendBuf, CLASS_6015 obj6015,TSA meterAddr);
//extern INT8U getSaveTime(DateTimeBCD* saveTime,INT8U cjType,INT8U saveTimeFlag,DATA_TYPE curvedata);
//extern INT16U compose6012Buff(DateTimeBCD startTime,DateTimeBCD saveTime,TSA meterAddr,INT16U dataLen,INT8U* dataContent, INT8U port485);
extern mqd_t mqd_zb_task;
extern CLASS_4204 broadcase4204;
extern GUI_PROXY cjGuiProxy_plc;
extern Proxy_Msg* p_Proxy_Msg_Data;//液晶给抄表发送代理处理结构体,指向由guictrl.c配置的全局变量
extern TASK_CFG list6013[TASK6012_CAIJI];
extern INT8U analyzeProtocol698(INT8U* Rcvbuf, INT8U* resultCount, INT16S recvLen,
INT8U* apduDataStartIndex, INT16S* dataLen) ;
extern INT8U deal698RequestResponse(INT8U getResponseType,INT8U csdNum,INT8U* apdudata,OADDATA_SAVE* oadListContent,INT16U* apdudataLen);
extern INT8U parseSingleROADDataHead(INT8U* oadData,OADDATA_SAVE* oadListContent,INT8U* rcvCSDnum,INT8U* recordNum);
extern INT16U parseSingleROADDataBody(INT8U* oadData,OADDATA_SAVE* oadListContent,INT8U rcvCSDnum);
int task_Refresh(TASK_UNIT *taskunit);
void chkTsaTask(TASK_INFO *meterinfo);
//-----------------------------------------------------------------------------------------------------------------------------------------------------
typedef struct
{
INT8U startIndex; //报文中的某数据的起始字节
INT8U dataLen; //数据长度(字节数)
INT8U aunite; //一个数据单元长度
INT8U intbits; //整数部分长度
INT8U decbits; //小数部分长度
char name[30];
INT8U Flg07[4];//对应07表实时数据标识
OAD oad1;
OAD oad2;
}MeterCurveDataType;
#define CURVENUM 29
MeterCurveDataType meterCurveData[CURVENUM]=
{
{60, 4, 4, 6, 2, "正向有功总电能曲线", {0x00,0x01,0x00,0x00},{0x5002,0x02,0x00},{0x0010,0x02,0x00}},
{64, 4, 4, 6, 2, "反向有功总电能曲线", {0x00,0x02,0x00,0x00},{0x5002,0x02,0x00},{0x0020,0x02,0x00}},
{77, 4, 4, 6, 2, "一象限无功总电能曲线",{0x00,0x05,0x00,0x00},{0x5002,0x02,0x00},{0x0050,0x02,0x00}},
{81, 4, 4, 6, 2, "二象限无功总电能曲线",{0x00,0x06,0x00,0x00},{0x5002,0x02,0x00},{0x0060,0x02,0x00}},
{85, 4, 4, 6, 2, "三象限无功总电能曲线",{0x00,0x07,0x00,0x00},{0x5002,0x02,0x00},{0x0070,0x02,0x00}},
{89, 4, 4, 6, 2, "四象限无功总电能曲线",{0x00,0x08,0x00,0x00},{0x5002,0x02,0x00},{0x0080,0x02,0x00}},
{8, 6, 2, 3, 1, "当前电压", {0x02,0x01,0xff,0x00},{0x5002,0x02,0x00},{0x2000,0x02,0x00}},
{14, 9, 3, 3, 3, "当前电流", {0x02,0x02,0xff,0x00},{0x5002,0x02,0x00},{0x2001,0x02,0x00}},
{26, 12,3, 2, 4, "有功功率曲线", {0x02,0x03,0xff,0x00},{0x5002,0x02,0x00},{0x2004,0x02,0x00}},
{51, 8, 2, 2, 1, "功率因数曲线", {0x02,0x06,0xff,0x00},{0x5002,0x02,0x00},{0x200a,0x02,0x00}}
// {8, 2, 3, 1, "A相电压", {0x01,0x01,0x10,0x06}},
// {10, 2, 3, 1, "B相电压", {0x02,0x01,0x10,0x06}},
// {12, 2, 3, 1, "C相电压", {0x03,0x01,0x10,0x06}},
//
// {14, 3, 3, 3, "A相电流", {0x01,0x02,0x10,0x06}},
// {17, 3, 3, 3, "B相电流", {0x02,0x02,0x10,0x06}},
// {20, 3, 3, 3, "C相电流", {0x03,0x02,0x10,0x06}},
//
// {23, 2, 2, 2, "频率曲线", {0xFF,0xFF,0xFF,0xFF}},
//
// {26, 3, 2, 4, "总有功功率曲线", {0x00,0x03,0x10,0x06}},
// {29, 3, 2, 4, "A相有功功率曲线", {0x01,0x03,0x10,0x06}},
// {32, 3, 2, 4, "B相有功功率曲线", {0x02,0x03,0x10,0x06}},
// {35, 3, 2, 4, "C相有功功率曲线", {0x03,0x03,0x10,0x06}},
//
// {38, 3, 2, 4, "总无功功率曲线", {0x00,0x04,0x10,0x06}},
// {41, 3, 2, 4, "A相无功功率曲线", {0x01,0x04,0x10,0x06}},
// {44, 3, 2, 4, "B相无功功率曲线", {0x02,0x04,0x10,0x06}},
// {47, 3, 2, 4, "C相无功功率曲线", {0x03,0x04,0x10,0x06}},
//
// {51, 2, 3, 1, "总功率因数曲线", {0x00,0x05,0x10,0x06}},
// {53, 2, 3, 1, "A相功率因数曲线", {0x01,0x05,0x10,0x06}},
// {55, 2, 3, 1, "B相功率因数曲线", {0x02,0x05,0x10,0x06}},
// {57, 2, 3, 1, "C相功率因数曲线", {0x03,0x05,0x10,0x06}},
//
// {60, 4, 6, 2, "正向有功总电能曲线",{0x01,0x06,0x10,0x06}},
// {64, 4, 6, 2, "反向有功总电能曲线",{0x02,0x06,0x10,0x06}},
// {68, 4, 6, 2, "正向无功总电能曲线",{0x03,0x06,0x10,0x06}},
// {72, 4, 6, 2, "反向无功总电能曲线",{0x04,0x06,0x10,0x06}},
//
// {77, 4, 6, 2, "一象限无功总电能曲线",{0x01,0x07,0x10,0x06}},
// {81, 4, 6, 2, "二象限无功总电能曲线",{0x02,0x07,0x10,0x06}},
// {85, 4, 6, 2, "三象限无功总电能曲线",{0x03,0x07,0x10,0x06}},
// {89, 4, 6, 2, "四象限无功总电能曲线",{0x04,0x07,0x10,0x06}},
//
// {94, 3, 2, 4, "当前有功需量曲线", {0xFF,0xFF,0xFF,0xFF}},
// {97, 3, 2, 4, "当前无功需量曲线", {0xFF,0xFF,0xFF,0xFF}},
};
int findFromPools_ByTsa(INT8U *addr )
{
int i = 0;
for(i=0;i<4;i++)
{
if (memcmp(addr,plcPools.pool[i].tsa.addr,8) == 0 )
{
return i;
}
}
return -1;
}
int findFromPools(INT8U *addr ,INT8U *itemflag)
{
int i = 0;
for(i=0;i<4;i++)
{
if (memcmp(addr,plcPools.pool[i].tsa.addr,8) == 0 )
{
if (memcmp(itemflag,plcPools.pool[i].item.item07,4) == 0) //抄读项 与 回码数据项相同
{
return i;
}
}
}
return -1;
}
void myadd2Pools(int ti,int ii)
{
int i=0;
i = plcPools.point;
plcPools.pool[i].task_i = ti;
plcPools.pool[i].item_i = ii;
plcPools.pool[i].taskID = taskinfo.task_list[ti].taskId;
plcPools.pool[i].fangAn = taskinfo.task_list[ti].fangan.No;
memcpy(&plcPools.pool[i].item,&taskinfo.task_list[ti].fangan.items[ii],sizeof(DATA_ITEM));
memcpy(&plcPools.pool[i].tsa,&taskinfo.tsa,sizeof(TSA));
plcPools.point = (plcPools.point + 1)%4;
}
int findFangAnIndex(int code)
{
int i=0;
for(i=0;i<FANGAN6015_MAX;i++)
{
if (fangAn6015[i].sernum == code)
{
return i;
}
}
return -1;
}
void JugeLastTime_SetZero(TASK_INFO *tasklist)
{
DateTimeBCD ts;
time_t nowt = time(NULL);
int jianGe_sec=0,zhouqi_sec;
int i=0 , j=0,num=0,k=0;
num = tasklist->task_n;
for(i=0;i<num;i++)
{
zhouqi_sec = TItoSec(tasklist->task_list[i].ti);//一个周期的秒数
jianGe_sec = abs(nowt - tasklist->task_list[i].beginTime);//当前时刻距离开始时刻的秒数
k = jianGe_sec/zhouqi_sec ;
if (k>0)//计算上一个任务开始时刻
{
DbgPrintToFile1(31,"任务%d 计算下一次开始时间,标示清零(周期秒%d 间隔总秒数%d k=%d)",tasklist->task_list[i].taskId,zhouqi_sec,jianGe_sec,k);
tasklist->task_list[i].beginTime += k * zhouqi_sec;
ts = timet_bcd(tasklist->task_list[i].beginTime );
tasklist->task_list[i].begin = ts;
for(j=0;j<tasklist->task_list[i].fangan.item_n;j++)
tasklist->task_list[i].fangan.items[j].sucessflg = 0;
}
}
}
DateTimeBCD ChgSucessFlg(TASK_INFO *taskinfo_p,DATA_ITEM item,INT8U usrtype,INT8U protocol,INT8U sucessflg)
{
DateTimeBCD timebcd;
int i=0,j=0,tnum=0

laolei
- 粉丝: 3
最新资源
- xshell忘记服务器密码怎么办
- 梦幻域名防红COS系统源码 带后台 全开源
- 基于PLC的液体饲料自动调配与饲喂系统:梯形图程序、接线图及IO分配详解 · 接线图
- 基于S7-300 PLC和组态王的恒压供水系统解析:携带解释的梯形图程序、接线图原理图图纸、IO分配与组态画面
- COMSOL BIC多级子分解技术在复杂物理场仿真中的应用与优势 - 边界积分法
- 两电平12扇区异步电机直接转矩控制优化及其MATLAB与Python实现
- 最新单目标测试集:基于灰狼算法在CEC2022测试集的效能评估
- 基于PI+重复控制的APF有源电力滤波器谐波抑制策略:实现电流环优化与无功补偿,确保THD小于1%
- 基于MATLAB Simulink Simscape的六自由度并联机器人逆向运动学仿真与PID动力学控制
- 基于Simulink的微网多逆变器下垂控制与SVPWM仿真实现及应用
- 智能优化算法在CEC2017中的表现与Friedman评价指标分析——基于Matlab的运行效果研究 - 智能优化算法
- 《基于FDTD方法的多篇论文研究:法诺共振、等离子激元及MIM结构在光学中的应用与仿真分析——附赠全面解析的FDTD学习知识库》
- 单相Boost PFC电路仿真的双闭环控制及其负载扰动下功率因数校正研究
- TI 25电赛小车 MPU6050 循迹
- 直接编译运行 C#解析 DXF:源码支持圆、直线、弧、多段线无封装缩放拖拽,读取坐标信息,支持多种CAD版本,可导出G代码 C# (2025年)
- COMSOL模拟深部咸水层封存二氧化碳 气候变迁
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论3