关于遥控复归保护
来源:互联网 发布:linux双网卡配置路由 编辑:程序博客网 时间:2024/04/29 13:41
保护遥控复归主要通过ykrstbh.par(YkResetBhPara标志)和在MyProcedureBase.c中的
1...void MyYkRstBHInit();
2...int MyYkNoIsRstBH(USHORT yk_id);
3...STATUS MyYkRstBHSignPut(USHORT yk_id);
4...BOOL MyYkRstBHSignGet(UCHAR channel_no,short *pAddr1,short *pAddr2);
函数来实现.
void MyYkRstBHInit()
{
BOOL read_ok;
int err_code;
USHORT i;
read_ok=MyReadParaFile(0,"/Tffs/ykrstbh.par","YkResetBhPara",
(UCHAR *)&yk_rst,sizeof(YK_RESET_PARA),&err_code);
if( read_ok )
{
/*ykrstbh.par 读取成功,'32'为本机主程序*/
MyCheckSelfPut(32,518,0);
yk_rst.num=( yk_rst.num>YK_RST_BH_MAX_NUM ) ? YK_RST_BH_MAX_NUM : yk_rst.num;
}
else
{
yk_rst.num=0;
}
for(i=0; i<MY_MAX_CHANNEL_NUM; i++)
{
rst_bh[i].sign=FALSE;
rst_bh[i].addr1=-1;
rst_bh[i].addr2=-1;
}
return;
}
int MyYkNoIsRstBH(USHORT yk_id)
{
int i;
for(i=0; i<yk_rst.num; i++)
{
if( yk_id == yk_rst.rec[i].yk_no ) break;
}
return (i >= yk_rst.num) ? -1 : i;
}
STATUS MyYkRstBHSignPut(USHORT yk_id)
{
USHORT i;
int rec_off;
rec_off=MyYkNoIsRstBH(yk_id);
if( rec_off == -1 ) return ERROR;
semTake(my_sem_yk_rst_bh,WAIT_FOREVER);
if( yk_rst.rec[rec_off].bh_type != -1 )
{
switch( yk_rst.rec[rec_off].bh_type )
{
case 0: /*CAN保护*/
rst_bh[0].sign=TRUE;
rst_bh[0].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[0].addr2=yk_rst.rec[rec_off].addr2;
break;
case 1: /*Iec103保护*/
/*网络103保护*/
rst_bh[20].sign=TRUE;
rst_bh[20].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[20].addr2=yk_rst.rec[rec_off].addr2;
/*串口103保护*/
for(i=0; i<SYSTEM_MAX_SERIAL; i++)
{
if( NsGetCommType(i) == NS_BH_RCS103 )
{
rst_bh[i+2].sign=TRUE;
rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
}
}
break;
case 2: /*RCS_LFP保护*/
for(i=0; i<SYSTEM_MAX_SERIAL; i++)
{
if( NsGetCommType(i) == NS_BH_LFP30 )
{
rst_bh[i+2].sign=TRUE;
rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
}
}
break;
case 3: /*ISA_DFP保护*/
for(i=0; i<SYSTEM_MAX_SERIAL; i++)
{
if( NsGetCommType(i) == NS_BH_ISA30CDT ||
NsGetCommType(i) == NS_BH_ISA30POLLING ||
NsGetCommType(i) == NS_BH_ISA201 ||
NsGetCommType(i) == NS_BH_DFP )
{
rst_bh[i+2].sign=TRUE;
rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
}
}
break;
case 4: /*南自94保护*/
for(i=0; i<SYSTEM_MAX_SERIAL; i++)
{
if( NsGetCommType(i) == NS_BH_NZ94 )
{
rst_bh[i+2].sign=TRUE;
rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
}
}
break;
/*JXY-NEED-MODIFY*/
case 255: /*07.01.17:jxy*/
for(i=0; i<MY_MAX_CHANNEL_NUM; i++)
{
rst_bh[i].sign=TRUE;
rst_bh[i].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[i].addr2=yk_rst.rec[rec_off].addr2;
}
break;
/*JXY-NEED-MODIFY-END*/
default:
break;
}
}
else /*按介质复归,0~31号介质*/
{
if( yk_rst.rec[rec_off].channel_no>0 && yk_rst.rec[rec_off].channel_no<MY_MAX_CHANNEL_NUM )
{
rst_bh[i+2].sign=TRUE;
rst_bh[i+2].addr1=yk_rst.rec[rec_off].addr1;
rst_bh[i+2].addr2=yk_rst.rec[rec_off].addr2;
}
}
semGive(my_sem_yk_rst_bh);
return OK;
}
/*JXY-NEED-MODIFY*/
/*07.03.16:jxy*/
void MyNetPutRstBhAll(short addr1,short addr2)
{
USHORT i;
semTake(my_sem_yk_rst_bh,WAIT_FOREVER);
for ( i = 0; i < MY_MAX_CHANNEL_NUM; i++ )
{
if ( i == 20 )
{
rst_bh[i].sign = FALSE;
rst_bh[i].addr1 = addr1;
rst_bh[i].addr2 = addr2;
}
else
{
rst_bh[i].sign = TRUE;
rst_bh[i].addr1 = addr1;
rst_bh[i].addr2 = addr2;
}
}
semGive(my_sem_yk_rst_bh);
}
BOOL MyYkRstBHSignGet(UCHAR channel_no,short *pAddr1,short *pAddr2)
{
BOOL ret_flag;
semTake(my_sem_yk_rst_bh,WAIT_FOREVER);
ret_flag=rst_bh[channel_no].sign;
*pAddr1=rst_bh[channel_no].addr1;
*pAddr2=rst_bh[channel_no].addr2;
rst_bh[channel_no].sign=FALSE;
rst_bh[channel_no].addr1=-1;
rst_bh[channel_no].addr2=-1;
semGive(my_sem_yk_rst_bh);
return ret_flag;
}
工作过程为
利用1函数进行初始化,在初始化时首先读取对应的PAR,然后确定该PAR中的遥控数,最后按通道号将
所有通道的遥控标志和地址全部清0;
for(i=0; i<MY_MAX_CHANNEL_NUM; i++)
{
rst_bh[i].sign=FALSE;
rst_bh[i].addr1=-1;
rst_bh[i].addr2=-1;
}
在NsYkShell.c文件中的/*******************************************************************************************
功能:SCADA请求遥控执行或遥控撤销
参数:Port:SCADA号
YkId:遥控号
Cmd:NS_YK_EXE,NS_YK_CANCEL
返回:NS_SCADA_APPLY_YK_RET_OK:成功
NS_SCADA_APPLY_YK_RET_INVALID:失败
********************************************************************************************/
static int ScadaApplyYkExe(UCHAR Port,USHORT YkId,UCHAR Cmd,UCHAR Prop)
函数调用函数2判断系统正在执行的遥控号是否为PAR中设置的遥控号,是的话返回该遥控号所在的记录号
然后调用函数3根据该记录号读取yk_rst将对应的rst_bh[i]赋值.
最后对应的模块通过rst_bh[i]决定是否调用函数4将rst_bh[i]中的地址读过去.
然后组织复归报文发下去.同时将rst_bh[i]标志和地址全部清零。
用到的头文件有
MyProcedureBase.h.定义了
SEM_ID my_sem_yk_rst_bh; /*MyBHResetSignGet,MyBHResetSignPut函数的互斥量*/
static YK_RESET_PARA yk_rst;
static YK_RST_BH_SIGN rst_bh[MY_MAX_CHANNEL_NUM];
MyProcedureExt.h定义了
#define YK_RST_BH_MAX_NUM 200
typedef struct
{
short yk_no;
short bh_type;
short channel_no;
short addr1;
short addr2;
}YK_RST_REC;
typedef struct
{
BOOL sign;
short addr1;
short addr2;
}YK_RST_BH_SIGN;
typedef struct
{
short num;
YK_RST_REC rec[YK_RST_BH_MAX_NUM];
short no_use[999];
}YK_RESET_PARA;
介质对应关系:
case 0: /*CAN保护*/
case 1: /*Iec103保护*/
/*网络103保护*/
/*串口103保护*/
case 2: /*RCS_LFP保护*/
case 3: /*ISA_DFP保护*/
case 4: /*南自94保护*/
CAN 报文中第二字节对应PAR中的地址1,unit_addr对应地址2
串口103保护 addr1对应节点地址
PAR参数设置说明
保护遥控数:实际需要设置的遥控数目
保护复归遥控表:遥控号:实际的遥控号;
复归类型:CAN保护设置为0;IEC103保护(网络和串口)设置为1;LFP保护设置为2;ISA_DFP保护设置为3;南自94保护设置为4。
复归介质:使用复归类型时,复归介质设置为-1;否则复归类型设置为-1,复归介质对应关系为通道对应关系,CAN设置为1,串口1---16设置为2到17,以太网保护设置为20;目前代码需要做相应的修改。
地址1:对于串口103保护为装置地址;对于CAN保护为报文的第2字节
地址2:
- 关于遥控复归保护
- 复归
- 关于遥控中用到的几个函数
- 关于红外遥控的一点资料整理
- 关于保护模式
- 关于viewstate保护问题
- 关于网站图片保护
- 关于文件保护路径
- 关于代码加密解密保护
- 关于DEP - 数据执行保护
- 关于保护源代码安全建议
- 关于python中的“保护”权限
- 关于保护继电器触点(灭弧)
- 遥控电路设计
- 遥控编码
- 遥控kindle
- 遥控小车
- 遥控车
- C#二进制文本的读写
- JSF样式
- Linux2.6内核TouchScreen驱动移植(已测试)
- C#TXT文本的读写
- 百丽创新供应链
- 关于遥控复归保护
- CSDN开博
- Linux下tty、pty、pts的概念区别
- TextBox 数字属性
- 关于项目管理的文章,很有借鉴意义
- linux 常用命令
- C# asp.net 求救
- C#.net的内部对象
- asp.net服务器组件开发给System.Web.UI.WebControls.Label增加单击事件