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

📄 103.c

📁 标准103规约的说明和在mc68332开发环境下的详细程序
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "typedef.h"
#include "nucleus.h"
#include "com_lan.h"
#include "lan_jiekou.h"
#include "103.h"

#define  ASDU07_SIZE	7
#define  ASDU20_SIZE	8
#define  ASDU21_SIZE	11

static BYTE quhaobuf[16];
static BYTE lastcommaddbuf[8];
static BYTE read_default_counter[8] = {0,0,0,0,0,0,0,0};
//--------------------------------------103规约传送原因的定义:(子站)-----------------
//1----》自发(突发)
//2----》循环
//8----》时间同步
//9----》总查询
//10---》总查询终止
//11---》当地操作
//12---》远方操作
//20---》命令的肯定认可
//21---》命令的否定认可
//31---》扰动数据的传送
//40---》通用分类写命令的肯定认可
//41---》通用分类写命令的否定认可
//42---》通用分类读命令的有效数据响应
//43---》通用分类读命令的无效数据响应
//44---》通用分类写确认
//
//-------------------------------------103规约传送原因的定义:(主站)------------------
//8----》时间同步
//9----》总查询
//20---》一般命令
//31---》扰动数据的传输
//40---》通用分类写命令
//42---》通用分类读命令
//
//id=物理链路控制字,recvbuf=接受报文缓从区,wLen=接受报文的长度,sendbuf=发送缓冲区
//
//
extern NU_MEMORY_POOL  System_Memory;

void C103_Receive(WORD id, BYTE* recvbuf, WORD wLen, BYTE* sendbuf)
{
	STATUS	 status;
	int		 total_len =wLen;
	BYTE	*buff103;

	status =NU_Allocate_Memory(&System_Memory, &buff103,3072,NU_NO_SUSPEND);
	if (status == NU_SUCCESS)
	{
		while (total_len > 0)
		{
			WORD  data_len =Lan_ack(recvbuf, (WORD)total_len, sendbuf, id, buff103);
			recvbuf  +=data_len;
			total_len-=data_len;
		}
		NU_Deallocate_Memory(buff103);
	}
}

WORD Lan_ack(BYTE *rbuf, WORD wLen, BYTE *sbuf, WORD id, BYTE *buff103)
{
	switch (rbuf[0])
	{
	case 0x06:
	    Lan_edit06(rbuf,wLen,sbuf,id,buff103);
	    return wLen;
	case 0x07:
		Lan_edit07(rbuf,wLen,sbuf,id,buff103);
		return ASDU07_SIZE;
	case 0x0a:
		Lan_edit10(rbuf,wLen,sbuf,id,buff103);
		return wLen;	
	case 0x14:
		Lan_edit20(rbuf,wLen,sbuf,id,buff103);
		return ASDU20_SIZE;
	case 0x15:
		Lan_edit21(rbuf,wLen,sbuf,id,buff103);
		return ASDU21_SIZE;
	case 0x18:
		Lan_edit24(rbuf,wLen,sbuf,id,buff103);
		return wLen;
	case 0x19:
		Lan_edit25(rbuf,wLen,sbuf,id,buff103);
		return wLen;
	default:
		return wLen;
	}
}
//////////////////////////////////////////////
void Lan_edit06(BYTE *rbuf,WORD wLen,BYTE *sbuf,WORD id,BYTE *buff103)
{
	//时钟同步
	BYTE* pt;
	BYTE* s;
	BYTE commaddress;
	pt =rbuf+3;
	commaddress =*pt;
	pt =rbuf+6;
	s =buff103;
	*s++ =*pt++;//msl
	*s++ =*pt++;//msh
	*s++ =*pt++;//min
	*s++ =*pt++;//hours
	*s++ =((*pt)>>5)&0x07;//weeks
	*s++ =(*pt++)&0x1f;//date
	*s++ =(*pt++)&0x0f;//mon
	*s++ =(*pt++)&0x7f;//year
	Set103_clock(buff103,commaddress);
}	

void Lan_edit07(BYTE *rbuf,WORD wLen,BYTE *sbuf,WORD id,BYTE *buff103)
{
	//总查询
	BYTE con;
	BYTE commaddress;
	BYTE fun;
	BYTE inf;
	BYTE scn;
	BYTE *pt;
	pt=rbuf+2;
	con=*pt++;	   //传送原因
	commaddress=*pt++;//取公共地址
	fun=*pt++;	  //功能类型
	inf=*pt++;	  //信息序号
	scn=*pt++;	  //扫描序号	
	send0a(sbuf,id,con,commaddress,fun,scn,buff103);
	return;
}	

void Lan_edit10(BYTE *rbuf,WORD wLen,BYTE *sbuf,WORD id,BYTE *buff103)
{
	//通用分类数据
	BYTE cot;//传送原因
	BYTE commaddress;//公用地址
	BYTE fun;//功能类型
	BYTE inf;//信息序号
	BYTE rii;//返回表示
	BYTE ngd;//通用分类集数目
	BYTE ginh;
	BYTE ginl;//通用分类标识序号
	BYTE j;
	BYTE quhao;
	WORD i;
	BYTE *pt;
	BYTE *apack;
	apack=sbuf;
	pt =rbuf+2;
	cot=*pt++;
	commaddress=*pt++;
	fun=*pt++;
	inf=*pt++;
	rii=*pt++;
	ngd=*pt++;
	
	ginh=*pt++;
	ginl=*pt++;
	
	switch(inf)
	{
	case 249:
		//带确认的写条目
		//处理该报文
		//发送返回报文
		if (wLen < 15)
		{
			cot = 41;
			send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
			return;
		}
		else
		{
			switch(ginh)
			{
			case 0x00:
				switch(ginl)
				{
				case 0x02:
					//当前定值区
					apack =quhaobuf+id*2;
					pt =rbuf+14;
					*apack++ =0x33;
					*apack =*pt;
					cot =44;
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				case 0x03:
					//运行定值区
					apack =buff103;
					pt =rbuf+14;
					*apack =*pt;
					if(Set103_selectarea( buff103,commaddress) == true)
					{
						cot =44;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				case 0x07:
					//脉冲预制数
					apack =buff103;
					pt =rbuf+9;
					quhao =*pt;
					pt =rbuf+11;
					*apack++ =ngd;//数目
					while(ngd > 0,ngd--)
					{
						*apack++ =quhao-1;
						*apack++ =*pt++;//数据类型
						j =*pt;//数据宽度
						*apack++ =*pt++;//数据宽度
						*apack++ =*pt++;//数目
						while(j > 0,j--)
						{
							*apack++ =*pt++;
						}
						pt++;
						quhao =*pt;
						pt++;
						pt++;
					}
					if(Set103_pulsedata( buff103,commaddress) == true)
					{
						cot =44;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					//Set103_pulsedata
					return;
				case 0x05:
					//脉冲冻结和解冻命令
					apack =buff103;
					pt =rbuf+14;
					*apack++ =*pt;//命令
					if(Set103_pulsecom( buff103,commaddress) == true)
					{
						cot =44;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				case 0x06:
					//远方复归
					apack =buff103;
					pt =rbuf+11;
					*apack++ =ngd;//数目
					while(ngd > 0,ngd--)
					{
						*apack++ =*pt++;//数据类型
						j =*pt;//数据宽度
						*apack++ =*pt++;//数据宽度
						*apack++ =*pt++;//数目
						while(j > 0,j--)
						{
							*apack++ =*pt++;
						}
						pt++;
						pt++;
						pt++;
					}
					if(Set103_sfugui( buff103,commaddress) == true)
					{
						cot =44;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				default:
					break;	
				}
			case 0x02:
			case 0x03:
				//修改定值			
				*apack++ =0x00;
				quhao =*apack;
				apack =buff103;
				pt =rbuf+11;
				*apack++ =ngd;//数目
				while(ngd > 0,ngd--)
				{
					*apack++ =*pt++;//数据类型
					j =*pt;//数据宽度
					*apack++ =*pt++;//数据宽度
					*apack++ =*pt++;//数目
					while(j > 0,j--)
					{
						*apack++ =*pt++;
					}
					pt++;
					pt++;
					pt++;
				}
				apack =quhaobuf+id*2;
				if (*apack++ == 0x33)
				{
					quhao=*apack;
					if(Set103_setdata( buff103,commaddress,quhao) == true)
					{
						cot =44;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
				}
				return;

			case 0x0b:
				//遥控开关
				apack =buff103;
				pt =rbuf+9;
				*apack++ =(*pt)-1;//条目号
				//*apack++ =*pt;//条目号
				pt =rbuf+14;
				*apack++ =*pt;//值

				if(Set103_selectdz( buff103,commaddress) == true)
				{
					cot =44;
				}
				else
				{
					cot =41;
				}
				send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
				return;
			case 0x0c:
				//遥控分头
				apack =buff103;
				pt =rbuf+9;
				*apack++ =(*pt)-1;//条目号
				pt =rbuf+14;
				*apack++ =*pt;//值

				if(Set103_selectft( buff103,commaddress) == true)
				{
					cot =44;
				}
				else
				{
					cot =41;
				}
				send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
				return;
			case 0x0e:
				//遥控压板
				apack =buff103;
				pt =rbuf+9;
				*apack++ =(*pt)-1;//条目号
				//*apack++ =*pt;//条目号
				pt =rbuf+14;
				*apack++ =*pt;//值

				if(Set103_selectyb( buff103,commaddress) == true)
				{
					cot =44;
				}
				else
				{
					cot =41;
				}
				send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
				return;
			default:
			break;	
			}
		}
		
	case 250:
		//带执行的写条目
		//处理该报文
		//发送返回报文
		if (wLen < 15)
		{
			cot = 41;
			send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
			return;
		}
		else
		{
			switch(ginh)
			{
			case 0x00:
				switch(ginl)
				{
				case 0x02:
					//当前定值区
					apack =quhaobuf+id*2;
					pt =rbuf+14;
					*apack++ =0x33;
					*apack =*pt;
					cot =40;
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				case 0x03:
					//运行定值区
					apack =buff103;
					pt =rbuf+14;
					*apack =*pt;
					if(Set103_controlarea( buff103,commaddress) == true)
					{
						cot =40;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				case 0x07:
					apack =buff103;
					pt =rbuf+9;
					quhao =*pt;
					pt =rbuf+11;
					*apack++ =ngd;//数目
					while(ngd > 0,ngd--)
					{
						*apack++ =quhao-1;
						*apack++ =*pt++;//数据类型
						j =*pt;//数据宽度
						*apack++ =*pt++;//数据宽度
						*apack++ =*pt++;//数目
						while(j > 0,j--)
						{
							*apack++ =*pt++;
						}
						pt++;
						quhao =*pt;
						pt++;
						pt++;
					}
					if(Set103_pulsedata( buff103,commaddress) == true)
					{
						cot =40;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					//Set103_pulsedata
					return;
				case 0x05:
					//脉冲冻结和解冻命令0
					apack =buff103;
					pt =rbuf+14;
					*apack++ =*pt;//命令
					if(Set103_pulsecom( buff103,commaddress) == true)
					{
						cot =40;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				case 0x06:
					//远方复归
					apack =buff103;
					pt =rbuf+11;
					*apack++ =ngd;//数目
					while(ngd > 0,ngd--)
					{
						*apack++ =*pt++;//数据类型
						j =*pt;//数据宽度
						*apack++ =*pt++;//数据宽度
						*apack++ =*pt++;//数目
						while(j > 0,j--)
						{
							*apack++ =*pt++;
						}
						pt++;
						pt++;
						pt++;
					
					}
					if(Set103_cfugui( buff103,commaddress) == true)
					{
						cot =40;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
					return;
				default:
					break;	
				}
			case 0x02:
			case 0x03:
				//修改定值
				apack =buff103;
				pt =rbuf+11;
				*apack++ =ngd;//数目
				while(ngd > 0,ngd--)
				{
					*apack++ =*pt++;//数据类型	

					j =*pt;//数据宽度

					*apack++ =*pt++;//数据宽度
					*apack++ =*pt++;//数目
					while(j > 0,j--)
					{
						*apack++ =*pt++;
					}
					pt++;
					pt++;
					pt++;
					
				}
				apack =quhaobuf+id*2;
				if (*apack == 0x33)
				{
					*apack++=0x00;
					quhao =*apack;
					if(Set103_setquhao( buff103,commaddress,quhao) == true)
					{
						cot =40;
					}
					else
					{
						cot =41;
					}
					send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
				}
				return;
			case 0x0a:
				//*******************
								//脉冲预制数
				apack =buff103;
				pt =rbuf+9;
				quhao =*pt;
				pt =rbuf+11;
				*apack++ =ngd;//数目
				while(ngd > 0,ngd--)
				{
					*apack++ =quhao-1;
					*apack++ =*pt++;//数据类型
					j =*pt;//数据宽度
					*apack++ =*pt++;//数据宽度
					*apack++ =*pt++;//数目
					while(j > 0,j--)
					{
						*apack++ =*pt++;
					}
					pt++;
					quhao =*pt;
					pt++;
					pt++;
				}
				if(Set103_pulsedata( buff103,commaddress) == true)
				{
					cot =40;
				}
				else
				{
					cot =41;
				}
				send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
	
		
				return;

		
			case 0x0b:
				//遥控开关
				apack =buff103;
				pt =rbuf+9;
				*apack++ =(*pt)-1;//条目号
				pt =rbuf+14;
				*apack++ =*pt;//值

				if(Set103_controldz( buff103,commaddress) == true)
				{
					cot =40;
				}

⌨️ 快捷键说明

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