📄 modbus.c.svn-base
字号:
SCC_BUSY[port_number]=2;
if ((SCC_RBUF[port_number][1]==1)||(SCC_RBUF[port_number][1]==2)) //RIC(coil),RIS(input sts)
{
NBytes = SCC_RBUF[port_number][2];
N = SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
LocRefNum = SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
ModbusSetCoils(LocRefNum, N, SCC_RBUF[port_number]+3);
SCC_BUSY[port_number]=0xff;
}
else if ((SCC_RBUF[port_number][1]==3)||(SCC_RBUF[port_number][1]==4)) //RHR,RIR
{
NBytes = SCC_RBUF[port_number][2];
N = SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
LocRefNum = SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
ModbusSetRegs(LocRefNum, N, SCC_RBUF[port_number]+3);
SCC_BUSY[port_number]=0xff;
}
else if ((SCC_RBUF[port_number][1]==5)||(SCC_RBUF[port_number][1]==6)) //PHR,写寄存器,无实际返回.
{
SCC_BUSY[port_number]=0xff;
}
else if ((SCC_RBUF[port_number][1]==15)||(SCC_RBUF[port_number][1]==16)) //PHR,写寄存器,无实际返回.
{
SCC_BUSY[port_number]=0xff;
}
intbk:
DBDataPrint(*SCC_RX_BD0_LN[port_number], port_number, SCC_RBUF[port_number], error);
(*SCC_RX_BD0_ST[port_number])=0xb000;
(*SCC_RX_BD0_LN[port_number])=0x0;
}
/********************************************************************************************************/
unsigned short compile_com(int port_number)
{
unsigned short i,j;
j=0;
for (i=0;i<MAXTASKS;i++)
{
if (SCC_TASK_VALID[port_number][i]!=0)
{
SCC_TASK_LIST[port_number][j]=i;
j++;
}
}
SCC_TASK_LIST[port_number][j]=0xff;
SCC_TASK_PTR[port_number]=0;
SCC_BUSY[port_number]=0;
SCC_TASKID[port_number]=0;
SCC_TASKNO[port_number]=j;
return j;
}
void SCC_task_start(int port_number)
{
unsigned short i, N, LocRefNum, FarRefNum,SendLen = 0;
LocRefNum = SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
FarRefNum = SCC_TASK_SAddr[port_number][SCC_TASKID[port_number]];
N=SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
SCC_TBUF[port_number][0]=SCC_TASK_STNO[port_number][SCC_TASKID[port_number]];
SCC_TBUF[port_number][1]=SCC_TASK_RW[port_number][SCC_TASKID[port_number]];
SCC_TBUF[port_number][2]=FarRefNum >> 8;
SCC_TBUF[port_number][3]=FarRefNum & 0xff;
SCC_TBUF[port_number][4]=N >> 8;
SCC_TBUF[port_number][5]=N & 0xff;
switch(SCC_TASK_RW[port_number][SCC_TASKID[port_number]])
{
case 1:
case 2:
{
SendLen = 8;
break;
}
case 3:
case 4:
{
SendLen = 8;
break;
}
case 5:
{
if(ModbusGetCoil(LocRefNum, SCC_TBUF[port_number] + 4) == 1)
{
SCC_TBUF[port_number][5] = 0; //data ho
SendLen = 8;
}
else
{
SendLen = 0;
}
break;
}
case 6:
{
if(ModbusGetRegs(LocRefNum, 1, SCC_TBUF[port_number] + 4) == 1)
{
SendLen = 8;
}
else
{
SendLen = 0;
}
break;
}
case 15:
{
if(ModbusGetCoils(LocRefNum, N, SCC_TBUF[port_number] + 7) == N)
{
SCC_TBUF[port_number][6] = (N + 7)/8;
SendLen = 9 + SCC_TBUF[port_number][6];
}
else
{
SendLen = 0;
}
break;
}
case 16:
{
if(ModbusGetRegs(LocRefNum, N, SCC_TBUF[port_number] + 7) == N)
{
SCC_TBUF[port_number][6] = N * 2;
SendLen = 9 + SCC_TBUF[port_number][6];
}
else
{
SendLen = 0;
}
break;
}
default:
{
SendLen = 0;
}
}
if(SendLen > 0)
{
i=FormCRC(SCC_TBUF[port_number],SendLen - 2);
SCC_TBUF[port_number][SendLen - 2]=i & 0xff;
SCC_TBUF[port_number][SendLen - 1]=i >> 8;
((struct GSMR_L*)GSMR_L[port_number])->ENT=0;
(*SCC_TX_BD0_LN[port_number])=SendLen;
(*SCC_TX_BD0_ST[port_number])=0xB000;
((struct GSMR_L*)GSMR_L[port_number])->ENT=1;
DBDataPrint(*SCC_TX_BD0_LN[port_number], port_number, SCC_TBUF[port_number], DIAG_SEND_MSG);
}
}
/***********************************************************************************************/
void SCC_task_schedul(int port_number)
{
unsigned char taskid;
unsigned short i;
//unsigned short NRegs,MAddr,SAddr;
SCC_BUSY_TICKS[port_number]++;
lp:
if (SCC_BUSY[port_number]==0)
{
taskid=SCC_TASK_LIST[port_number][SCC_TASK_PTR[port_number]];
if (taskid>=MAXTASKS) SCC_TASK_PTR[port_number]=0;
taskid=SCC_TASK_LIST[port_number][SCC_TASK_PTR[port_number]];
SCC_TASKID[port_number]=taskid;
if (taskid<MAXTASKS)
{
//math task immdiate exec...
//if (SCC_TASK_RW[port_number][SCC_TASKID[port_number]]==0)
//{
// NRegs=SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
// MAddr=SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
// SAddr=SCC_TASK_SAddr[port_number][SCC_TASKID[port_number]];
// READY_DATA=0;
// while(READY_DATA);
// for (i=0;i<NRegs;i++)
// {
// g_HRDATA[MAddr+i]=g_HRDATA[SAddr+i];
// }
// HRDATA_NEWFLAG = NEW_WRITE;
// READY_DATA=1;
// SCC_TASK_RETRY[port_number]=0;
// SCC_TASK_PTR[port_number]++;
// goto lp;
//}
//comm task exec...
SCC_BUSY[port_number]=1; //!!!
SCC_BUSY_TICKS[port_number]=0;
if (SCC_MS[port_number]==1)
SCC_task_start(port_number);
else if (SCC_MS[port_number]==9)
SCC_task_start_DC(port_number);
//添加XJ启动代码
//else if (SCC_MS[port_number]==5)
//task_start_XJ(port_number);
}
else SCC_TASK_PTR[port_number]=0;
return;
}
if (SCC_BUSY[port_number]==0x1)
{
if (SCC_BUSY_TICKS[port_number]>SCC_TASK_TOver[port_number][SCC_TASKID[port_number]]) //当前任务超时
{
SCC_BUSY[port_number]=0; //!!!
if (SCC_TASK_RETRY[port_number]<1) //重发一次
{
SCC_TASK_RETRY[port_number]++;
}
else
{
//com err proc...
//NRegs=SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
//MAddr=SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
SetStationSTS(port_number, SCC_TASK_STNO[port_number][SCC_TASKID[port_number]], 0);
SCC_TASK_RETRY[port_number]=0;
SCC_TASK_PTR[port_number]++;
}
}
return;
}
if (SCC_BUSY[port_number]==0x2) //slave_comproc:1->2
{
SCC_BUSY[port_number]=0x3; //!!!
SCC_BUSY_TICKS[port_number]=0;
if (SCC_TASK_RETRY[port_number]<1)
{
SCC_TASK_RETRY[port_number]++;
}
else
{
//com err proc...
//NRegs=SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
//MAddr=SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
SetStationSTS(port_number, SCC_TASK_STNO[port_number][SCC_TASKID[port_number]], 0);
SCC_TASK_RETRY[port_number]=0;
SCC_TASK_PTR[port_number]++;
}
return;
}
if (SCC_BUSY[port_number]==3) //等待SCC的延时等待时间over
{
if (SCC_BUSY_TICKS[port_number]>SCC_PAUSE_TICKS[port_number]) SCC_BUSY[port_number]=0; //!!!
return;
}
if (SCC_BUSY[port_number]==0xff) //收到从站的正常返回后:1->0xff
{
//com ok proc...
SCC_BUSY[port_number]=0x3; //!!!
SCC_BUSY_TICKS[port_number]=0;
//NRegs=SCC_TASK_NRegs[port_number][SCC_TASKID[port_number]];
//MAddr=SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
//SetStationSTS(port_number, SCC_TASK_SAddr[port_number][SCC_TASKID[port_number]], 1);
SetStationSTS(port_number, SCC_TASK_STNO[port_number][SCC_TASKID[port_number]], 1);
SCC_TASK_RETRY[port_number]=0;
SCC_TASK_PTR[port_number]++;
return;
}
}
/***************************************************************************************************/
void comproc(void)
{
short i;
int port_number;
for(port_number=0;port_number<4;port_number++)
{
if (SCC_INTFLAG[port_number]==1)
{
SCC_INTFLAG[port_number]=0;
switch(SCC_MS[port_number]) //PROTOCOL
{
case 0:
SCC_comproc_modebus_s(port_number);
break;
case 1:
SCC_comproc_modebus_m(port_number);
break;
case 9:
SCC_comproc_DC(port_number);
break;
//case n: other protocols
case 5:
//recv_XJ(port_number);
break;
default:
break;
}
}
}
if ((TASK_START_FLAG==1)&&((SCC_MS[0]==1)||(SCC_MS[0]==9)))
SCC_task_schedul(0);
if ((TASK_START_FLAG==1)&&((SCC_MS[1]==1)||(SCC_MS[1]==9)))
SCC_task_schedul(1);
if ((TASK_START_FLAG==1)&&((SCC_MS[2]==1)||(SCC_MS[2]==9)))
SCC_task_schedul(2);
if ((TASK_START_FLAG==1)&&((SCC_MS[3]==1)||(SCC_MS[3]==9)))
SCC_task_schedul(3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -