⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.c.svn-base

📁 给MOTO 360 单片机 开发的MODBUS协议 直流奥特寻协议。。要用SDS编译
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
    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 + -