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

📄 dc_aotexun.c.svn-base

📁 给MOTO 360 单片机 开发的MODBUS协议 直流奥特寻协议。。要用SDS编译
💻 SVN-BASE
字号:
/*******************************************************************************************
* MODBUS Master/Slaver Module (For Test)                                               
* Coded by celeron                                                                      
* 2007/11/02                                                                            
*******************************************************************************************/
#include "MODBUS_REG.h"
#include "MODBUSFDL.H"
#include "DPRam.h"
#include "modbus.h"
#include "console.h"
#include "dc_aotexun.h"
/**********************************************************************************************/
volatile unsigned char  SCC_TASK_PARA1[MAXPORT][MAXTASKS];
volatile unsigned char  SCC_TASK_PARA2[MAXPORT][MAXTASKS];
volatile unsigned char  SCC_TASK_PARA3[MAXPORT][MAXTASKS];
volatile unsigned short SCC_TASK_RAddr[MAXPORT][MAXTASKS];


void SCC_comproc_DC(int port_number)
{	
	unsigned short i,NRegs,NBytes,RAddr,CHK,bias,byteN;
	NBytes=SCC_RBUF[port_number][0];

	CHK=0;
	for(i=0;i<(NBytes-1);i++)
	CHK+=SCC_RBUF[port_number][i];

    DBDataPrint(*SCC_RX_BD0_LN[port_number], port_number, SCC_RBUF[port_number], DIAG_RECV_MSG);


    if (SCC_BUSY[port_number]!=1) goto intbk;
	SCC_BUSY[port_number]=2;  
	if (SCC_RBUF[port_number][1]!=SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]]) goto intbk;
	if (SCC_RBUF[port_number][2]!=SCC_TASK_STNO[port_number][SCC_TASKID[port_number]]) goto intbk;
	RAddr=SCC_TASK_RAddr[port_number][SCC_TASKID[port_number]];

	if (SCC_RBUF[port_number][NBytes-1]!=(CHK&0xff)||SCC_RBUF[port_number][NBytes]!=(CHK>>8)) goto intbk;//lo hi
	if (SCC_RBUF[port_number][3]==0x30)//采集直流系统模拟量
	{
		NBytes=SCC_RBUF[port_number][0];//116
		READY_DATA=0;
		while(READY_DATA);

		//存数据 不包括日期, 4个字节头 6字节日期
		for (i=0;i<(NBytes-11);i++)
		{
			g_HRDATA[RAddr+i]=SCC_RBUF[port_number][10 + i];
		}

		
		HRDATA_NEWFLAG = NEW_WRITE;
		READY_DATA=1;	
		
		SCC_BUSY[port_number]=0xff;

		goto intbk;	

	}
	if	(SCC_RBUF[port_number][3]==0x31)//采集直流系统运行状态
	{
		//RAddr=0;
		NBytes=SCC_RBUF[port_number][0];
		READY_DATA=0;
		while(READY_DATA);
		
		for (i=0;i<15;i++)//固定帧长数据
		{ 
			g_HRDATA[RAddr+i]=SCC_RBUF[port_number][10+i];
		}
		
		for (i=0;i<16;i++)//清零
		{
			g_HRDATA[RAddr+15+i]=0;			
		}
		for (i=0;i<(NBytes-26);i++)	//变帧长数据(故障支路)
		{
			if(SCC_RBUF[port_number][25+i] >= 128)
			{
				continue;
			}
			byteN=SCC_RBUF[port_number][25+i]/8;
			bias=SCC_RBUF[port_number][25+i]%8;
			g_HRDATA[RAddr+15+byteN]|=1<<bias;
		}
		HRDATA_NEWFLAG = NEW_WRITE;
		READY_DATA=1; 

		SCC_BUSY[port_number]=0xff;

		goto intbk;	
	}
	if	(SCC_RBUF[port_number][3]==0x38)//取电池巡检仪采样数据(命令码为:38H)
	{
		//RAddr=0;
		NBytes=SCC_RBUF[port_number][0];
		READY_DATA=0;
		while(READY_DATA);

		for (i=0;i<(NBytes-11);i++)
		{
			g_HRDATA[RAddr+i]=SCC_RBUF[port_number][10 + i];
		}

		HRDATA_NEWFLAG = NEW_WRITE;
		READY_DATA=1;
		SCC_BUSY[port_number]=0xff;

		goto intbk;	
	}

	if	(SCC_RBUF[port_number][3]==0x39)// 取绝缘监测仪数据(命令码为:39H)
	{
		//RAddr=0;
		NBytes=SCC_RBUF[port_number][0];
		READY_DATA=0;
		while(READY_DATA);

		for (i=0;i<(NBytes-11);i++)
		{
			g_HRDATA[RAddr+i]=SCC_RBUF[port_number][10 + i];
		}

		HRDATA_NEWFLAG = NEW_WRITE;
		READY_DATA=1;
		SCC_BUSY[port_number]=0xff;
		
		goto intbk;	
	}

intbk:
	(*SCC_RX_BD0_ST[port_number])=0xb000;	
	(*SCC_RX_BD0_LN[port_number])=0x0;
	return;

}

/**********************************************************************************************/
void SCC_task_start_DC(int port_number)
{
	unsigned short i,RAddr,NRegs,MAddr,SAddr; 

	MAddr=SCC_TASK_MAddr[port_number][SCC_TASKID[port_number]];
	RAddr=SCC_TASK_RAddr[port_number][SCC_TASKID[port_number]];
	SCC_TBUF[port_number][1]=SCC_TASK_STNO[port_number][SCC_TASKID[port_number]];
	SCC_TBUF[port_number][3]=SCC_TASK_RW[port_number][SCC_TASKID[port_number]];

    (*SCC_TX_BD0_LN[port_number])=0;
	if ((SCC_TASK_RW[port_number][SCC_TASKID[port_number]]==0x30)||(SCC_TASK_RW[port_number][SCC_TASKID[port_number]]==0x31))
	{

		SCC_TBUF[port_number][0]=5;
		SCC_TBUF[port_number][2]=MAddr;
		SCC_TBUF[port_number][3]=SCC_TASK_RW[port_number][SCC_TASKID[port_number]];
		i=(SCC_TBUF[port_number][0]+SCC_TBUF[port_number][1]+SCC_TBUF[port_number][2]+SCC_TBUF[port_number][3]);
		SCC_TBUF[port_number][4]=i&0xff;     //lo
		SCC_TBUF[port_number][5]=i>>8;       //hi



		((struct GSMR_L*)GSMR_L[port_number])->ENT=0;
		(*SCC_TX_BD0_LN[port_number])=6;
		(*SCC_TX_BD0_ST[port_number])=0xB000;
		((struct GSMR_L*)GSMR_L[port_number])->ENT=1;
	}
	else if(SCC_TASK_RW[port_number][SCC_TASKID[port_number]]==0x38)
	{
		SCC_TBUF[port_number][0]=8;
		SCC_TBUF[port_number][2]=MAddr;
		SCC_TBUF[port_number][3]=SCC_TASK_RW[port_number][SCC_TASKID[port_number]];
		SCC_TBUF[port_number][4]=SCC_TASK_PARA1[port_number][SCC_TASKID[port_number]];		 //电池巡检仪编号:1-4    
		SCC_TBUF[port_number][5]=SCC_TASK_PARA2[port_number][SCC_TASKID[port_number]];     //单节电池起始编号:1 ~ 120 
		SCC_TBUF[port_number][6]=SCC_TASK_PARA3[port_number][SCC_TASKID[port_number]];     //单节电池终止编号:1 ~ 120 
		i=(SCC_TBUF[port_number][0]+SCC_TBUF[port_number][1]+SCC_TBUF[port_number][2]+SCC_TBUF[port_number][3]+SCC_TBUF[port_number][4]+SCC_TBUF[port_number][5]+SCC_TBUF[port_number][6]);
		SCC_TBUF[port_number][7]=i&0xff;     //lo
		SCC_TBUF[port_number][8]=i>>8;       //hi
		
		
		((struct GSMR_L*)GSMR_L[port_number])->ENT=0;
		(*SCC_TX_BD0_LN[port_number])=9;
		(*SCC_TX_BD0_ST[port_number])=0xB000;
		((struct GSMR_L*)GSMR_L[port_number])->ENT=1;
	}
	else if(SCC_TASK_RW[port_number][SCC_TASKID[port_number]]==0x39)
	{
		SCC_TBUF[port_number][0]=6;
		SCC_TBUF[port_number][2]=MAddr;
		SCC_TBUF[port_number][3]=SCC_TASK_RW[port_number][SCC_TASKID[port_number]];
		SCC_TBUF[port_number][4]=SCC_TASK_PARA1[port_number][SCC_TASKID[port_number]];   //绝缘监测仪编号 取值:1 ~ 8
		i=(SCC_TBUF[port_number][0]+SCC_TBUF[port_number][1]+SCC_TBUF[port_number][2]+SCC_TBUF[port_number][3]+SCC_TBUF[port_number][4]);
		SCC_TBUF[port_number][5]=i&0xff;     //lo
		SCC_TBUF[port_number][6]=i>>8;       //hi	
		
		((struct GSMR_L*)GSMR_L[port_number])->ENT=0;
		(*SCC_TX_BD0_LN[port_number])=7;
		(*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);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -