📄 mgt100.c
字号:
void SendASDU7(unsigned char Port,unsigned char ASDU_TYP)//ADSU7总召唤
{
unsigned char *pTx = DevPort[Port]->txbuf;
unsigned char SendASDU_Length;
unsigned char i;
SendASDU_Length=9;
*pTx++ = 0x68;
*pTx++ = 0x09;
*pTx++ = 0x09;
*pTx++ = 0x68;
*pTx++ = m_Control[DevPort[Port]->Rtu_Adr] | 0x03;//发送确认帧传送数据
m_Control[DevPort[Port]->Rtu_Adr] = m_Control[DevPort[Port]->Rtu_Adr] ^ 0x20;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = ASDU_TYP;
*pTx++ = 0x81;
*pTx++ = 0x09;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = 0xff;//GLB 全局功能 FUN
*pTx++ = 0x00;//扫描序号 INF
m_nSCN[DevPort[Port]->Rtu_Adr]=(m_nSCN[DevPort[Port]->Rtu_Adr]+1)%256;
*pTx++ = m_nSCN[DevPort[Port]->Rtu_Adr];//扫描序号
*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);
*pTx++ = 0x16;
ClearCom(Port);
WriteCom(Port,pTx-DevPort[Port]->txbuf);
ReceiveASDU_Data_Analys(Port,0);
}
void SendASDU20(unsigned char Port,unsigned char ASDU_TYP)//LED复位
{
unsigned char *pTx = DevPort[Port]->txbuf;
unsigned char SendASDU_Length;
SendASDU_Length=10;
*pTx++ = 0x68;
*pTx++ = 0x0a;
*pTx++ = 0x0a;
*pTx++ = 0x68;
*pTx++ = 0x43;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = 0x14;
*pTx++ = 0x81;
*pTx++ = 0x14;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = 0xff;
*pTx++ = 0x13;
*pTx++ = 0x02;
*pTx++ = 0x00;
*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);;//
*pTx++ = 0x16;
ClearCom(Port);
WriteCom(Port,pTx-DevPort[Port]->txbuf);
}
void SendASDU64(unsigned char Port,unsigned char ASDU_TYP,unsigned char CHSdata,unsigned char EXCdata)//ADSU64发送遥控命令
{
unsigned char *pTx = DevPort[Port]->txbuf;
unsigned char SendASDU_Length;
SendASDU_Length=10;
*pTx++ = 0x68;//遥控选择
*pTx++ = 0x0a;
*pTx++ = 0x0a;
*pTx++ = 0x68;
*pTx++ = m_Control[DevPort[Port]->Rtu_Adr] | 0x03;;//发送确认帧传送数据
m_Control[DevPort[Port]->Rtu_Adr] = m_Control[DevPort[Port]->Rtu_Adr] ^ 0x20;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = ASDU_TYP;//64
*pTx++ = 0x81;
*pTx++ = 0x0c;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = 0x01;//GLB 全局功能 FUN
*pTx++ = 0x30;//扫描序号 INF
// m_RII=(m_RII+1)%256;
*pTx++ = CHSdata;//遥控选择分合命令
*pTx++ = 0x00;//
*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);
*pTx++ = 0x16;
ClearCom(Port);
WriteCom(Port,pTx-DevPort[Port]->txbuf);
ReceiveASDU_Data_Analys(Port,0);
usleep(200000);
ClearCom(Port);
pTx = DevPort[Port]->txbuf;
*pTx++ = 0x68;//遥控执行
*pTx++ = 0x0a;
*pTx++ = 0x0a;
*pTx++ = 0x68;
*pTx++ = m_Control[DevPort[Port]->Rtu_Adr] | 0x03;;//发送确认帧传送数据
m_Control[DevPort[Port]->Rtu_Adr] = m_Control[DevPort[Port]->Rtu_Adr] ^ 0x20;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = ASDU_TYP;//64
*pTx++ = 0x81;
*pTx++ = 0x0c;
*pTx++ = DevPort[Port]->Rtu_Adr;
*pTx++ = 0x01;//GLB 全局功能 FUN
*pTx++ = 0x30;//扫描序号 INF
*pTx++ = EXCdata;//遥控执行分合命令
*pTx++ = 0x00;//
*pTx++ = AddSum(DevPort[Port]->txbuf,SendASDU_Length,0);
*pTx++ = 0x16;
ClearCom(Port);
WriteCom(Port,pTx-DevPort[Port]->txbuf);
ReceiveASDU_Data_Analys(Port,0);
}
void ReceiveASDU1(struct Master_Data *p_dst,unsigned char*pRx)//解析故障告警
{
struct RtuSOE SoeTmp;
unsigned char FUNCode,INFNum;
FUNCode=pRx[4+6];
INFNum =pRx[5+6];
long buff1=pRx[16]*256+pRx[15];
SoeTmp.Adr = p_dst->Addr; //装置地址
SoeTmp.Code = INFNum+80;//事件类型(加上80,可以在CSU配置点表的原SOE事件后直接添加)
SoeTmp.Status = 0x55;
SoeTmp.Rtutime.Year = t_data.year-2000; //动作时间:年
SoeTmp.Rtutime.Month = t_data.mon; //动作时间:月
SoeTmp.Rtutime.Day = t_data.day; //动作时间:日
SoeTmp.Rtutime.Hour = pRx[18];; //动作时间:时
SoeTmp.Rtutime.Minute = (pRx[17]&0x3f); //动作时间:分
SoeTmp.Rtutime.Second= buff1; //动作时间:秒
SoeTmp.Rtutime.MilliSecondL= (unsigned char)(buff1%256); //动作时间:毫秒L
SoeTmp.Rtutime.MilliSecondH= (unsigned char)(buff1/256); //动作时间:毫秒H
SoeTmp.Data[0] = 0x00;//动作值L
SoeTmp.Data[1] = 0x00;//动作值H
IncEvnFlag();//事件记录计数器计数
WriteEvent(&SoeTmp); //记录保护事件记录
Alarm_ck(1);//启动报警接点
}
void ReceiveASDU15(struct Master_Data *p_dst,unsigned char *pRx)
{
int i;
for(i=0;i<10;i++)
{
*(&p_dst->Yc_Analog.Yc1+i)=MEA(*(pRx+6+6+2*i),*(pRx+6+7+2*i));
//printf("(&p_dst->Yc_Analog.Yc1+i)=%x\n",*(&p_dst->Yc_Analog.Yc1+i));
}
if(!((*(pRx+32))&0x01)) {p_dst->Yx_State.Kr1 = 0;}//分
else {p_dst->Yx_State.Kr1 = 1;}//合
if(!((*(pRx+32))&0x02)) {p_dst->Yx_State.Kr2 = 0;}//分
else {p_dst->Yx_State.Kr2 = 1;}//合
if(!((*(pRx+32))&0x04)) {p_dst->Yx_State.Kr3 = 0;}//分
else {p_dst->Yx_State.Kr3 = 1;}//合
if(!((*(pRx+32))&0x08)) {p_dst->Yx_State.Kr4 = 0;}//分
else {p_dst->Yx_State.Kr4 = 1;}//合
if(!((*(pRx+32))&0x10)) {p_dst->Yx_State.Kr5 = 0;}//分
else {p_dst->Yx_State.Kr5 = 1;}//合
if(!((*(pRx+32))&0x20)) {p_dst->Yx_State.Kr6 = 0;}//分
else {p_dst->Yx_State.Kr6 = 1;}//合
if(!((*(pRx+32))&0x40)) {p_dst->Yx_State.Kr7 = 0;}//分
else {p_dst->Yx_State.Kr7 = 1;}//合
if(!((*(pRx+32))&0x80)) {p_dst->Yx_State.Kr8 = 0;}//分
else {p_dst->Yx_State.Kr8 = 1;}//合
if(!((*(pRx+33))&0x01)) {p_dst->Yx_State.Kr9 = 0;}//分
else {p_dst->Yx_State.Kr9 = 1;}//合
if(!((*(pRx+33))&0x02)) {p_dst->Yx_State.Kr10 = 0;}//分
else {p_dst->Yx_State.Kr10 = 1;}//合
if(!((*(pRx+33))&0x04)) {p_dst->Yx_State.Kr11 = 0;}//分
else {p_dst->Yx_State.Kr11 = 1;}//合
if(!((*(pRx+33))&0x08)) {p_dst->Yx_State.Kr12 = 0;}//分
else {p_dst->Yx_State.Kr12 = 1;}//合
if(!((*(pRx+33))&0x10)) {p_dst->Yx_State.Kr13 = 0;}//分
else {p_dst->Yx_State.Kr13 = 1;}//合
if(!((*(pRx+33))&0x20)) {p_dst->Yx_State.Kr14 = 0;}//分
else {p_dst->Yx_State.Kr14 = 1;}//合
if(!((*(pRx+33))&0x40)) {p_dst->Yx_State.Kr15 = 0;}//分
else {p_dst->Yx_State.Kr15 = 1;}//合
if(!((*(pRx+33))&0x80)) {p_dst->Yx_State.Kr16 = 0;}//分
else {p_dst->Yx_State.Kr16 = 1;}//合
}
void ReceiveASDU41(struct Master_Data *p_dst,unsigned char *pRx)//单点信息开关变位(突变)
{
unsigned char FUNCode;
FUNCode=pRx[4+6];
switch(FUNCode)
{
case 1://遥信的功能码 FUN=1
switch(pRx[5+6])// INF
{
case 149:
if(pRx[12]&0x01) p_dst->Yx_State.Kr1=1;
else p_dst->Yx_State.Kr1=0;
break;
case 150:
if(pRx[12]&0x01) p_dst->Yx_State.Kr2=1;
else p_dst->Yx_State.Kr2=0;
break;
case 151:
if(pRx[12]&0x01) p_dst->Yx_State.Kr3=1;
else p_dst->Yx_State.Kr3=0;
break;
case 152:
if(pRx[12]&0x01) p_dst->Yx_State.Kr4=1;
else p_dst->Yx_State.Kr4=0;
break;
case 153:
if(pRx[12]&0x01) p_dst->Yx_State.Kr5=1;
else p_dst->Yx_State.Kr5=0;
break;
case 154:
if(pRx[12]&0x01) p_dst->Yx_State.Kr6=1;
else p_dst->Yx_State.Kr6=0;
break;
case 155:
if(pRx[12]&0x01) p_dst->Yx_State.Kr7=1;
else p_dst->Yx_State.Kr7=0;
break;
case 156:
if(pRx[12]&0x01) p_dst->Yx_State.Kr8=1;
else p_dst->Yx_State.Kr8=0;
break;
case 157:
if(pRx[12]&0x01) p_dst->Yx_State.Kr9=1;
else p_dst->Yx_State.Kr9=0;
break;
case 158:
if(pRx[12]&0x01) p_dst->Yx_State.Kr10=1;
else p_dst->Yx_State.Kr10=0;
break;
case 159:
if(pRx[12]&0x01) p_dst->Yx_State.Kr11=1;
else p_dst->Yx_State.Kr11=0;
break;
case 160:
if(pRx[12]&0x01) p_dst->Yx_State.Kr12=1;
else p_dst->Yx_State.Kr12=0;
break;
case 161:
if(pRx[12]&0x01) p_dst->Yx_State.Kr13=1;
else p_dst->Yx_State.Kr13=0;
break;
case 162:
if(pRx[12]&0x01) p_dst->Yx_State.Kr14=1;
else p_dst->Yx_State.Kr14=0;
break;
case 163:
if(pRx[12]&0x01) p_dst->Yx_State.Kr15=1;
else p_dst->Yx_State.Kr15=0;
break;
case 164:
if(pRx[12]&0x01) p_dst->Yx_State.Kr16=1;
else p_dst->Yx_State.Kr16=0;
break;
default:
break;
}
}
}
void ExeOperate(unsigned char Port)//检查端口是否有遥控/复位命令
{
unsigned char *p_YkId = &Yk_Id[Port].Yk1;
unsigned char CHSdata,EXCdata;
int i,num;
DevPort[Port]->Cmd_Doing = 1;
if(DevPort[Port]->Fg_Flag) // 复归操作
{
if(DevPort[Port]->Rtu_Adr == DevPort[Port]->Fg_Adr)
{
SendASDU20(Port,20);//发复归
DevPort[Port]->Fg_Ok = 2;
Rst_Cmd_Data(Port,Cmd_Fg); //清复归标志
}
}
if(DevPort[Port]->Yk_Flag) // 遥控操作
{
if(DevPort[Port]->Rtu_Adr == DevPort[Port]->Yk_Adr)
{
num = Calculate_YkNum(Port);//计算需遥控开关的数目
for(i=0;i<num;i++)
{
if(!(*p_YkId++))
continue;
if(DevPort[Port]->Yk_Num != (i+1)) //如果开关序号不匹配则继续循环
continue;
if(DevPort[Port]->Yk_Data == 1)
{
CHSdata=0x81; //选择分
EXCdata=0x01; //执行分
}
if(DevPort[Port]->Yk_Data == 2)
{
CHSdata=0x82; //选择合
EXCdata=0x02; //执行合
}
SendASDU64(Port,64,CHSdata,EXCdata);//发遥控命令
Rst_Cmd_Data(Port,Cmd_Yk);//清遥控标志
}
}
}
return;
}
//求带品质描述的遥测值
int MEA(unsigned char Data0,unsigned char Data1)
{
int temp1;
int D16;
int Val;
D16=Data1&0x80;
temp1=(Data1<<8)+Data0;
temp1=(temp1>>3);
if(D16==0)
{
Val=temp1;
}
else
{
temp1=temp1|0xe000;
Val=temp1;
}
return Val;
}
//创建上传量,填写参数以备在后台中有选择性地上传所要的量
void mgt100Creat_Data(unsigned char Port)
{
struct YcData_Id *pIdYc = &Yc_Id[Port];
struct YxData_Id *pIdYx = &Yx_Id[Port];
struct YkData_Id *pIdYk = &Yk_Id[Port];
struct FgData_Id *pIdFg = &Fg_Id[Port];
//创建遥控数据
CreatData(&pIdYk->Yk1);
//创建复归量用于复归
CreatData(&pIdFg->Fg);
//创建遥测数据
CreatData(&pIdYc->Yc1);
CreatData(&pIdYc->Yc2);
CreatData(&pIdYc->Yc3);
CreatData(&pIdYc->Yc4);
CreatData(&pIdYc->Yc5);
CreatData(&pIdYc->Yc6);
CreatData(&pIdYc->Yc7);
CreatData(&pIdYc->Yc8);
CreatData(&pIdYc->Yc9);
CreatData(&pIdYc->Yc10);
//创建遥信数据
CreatData(&pIdYx->Kr1);// 断路器位置
CreatData(&pIdYx->Kr2);// 开入1
CreatData(&pIdYx->Kr3);// 开入2
CreatData(&pIdYx->Kr4);// 开入3
CreatData(&pIdYx->Kr5);// 开入4
CreatData(&pIdYx->Kr6);// 开入5
CreatData(&pIdYx->Kr7);// 开入6
CreatData(&pIdYx->Kr8);// 开入7
CreatData(&pIdYx->Kr9);// 开入8
CreatData(&pIdYx->Kr10);// 开入9
CreatData(&pIdYx->Kr11);//
CreatData(&pIdYx->Kr12);//
CreatData(&pIdYx->Kr13);//
CreatData(&pIdYx->Kr14);//
CreatData(&pIdYx->Kr15);//
CreatData(&pIdYx->Kr16);// 开入16
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -