EDDL 一致性测试指南,适用于支持EDDL标准的Profibus DP,PA,HART及FF现场总线设备的测试
上传时间: 2017-09-06
上传用户:wl9454
/****************temic*********t5557***********************************/ #include <at892051.h> #include <string.h> #include <intrins.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //STC12C2051AD的SFR定义 sfr WDT_CONTR = 0xe1;//stc2051的看门狗?????? /**********全局常量************/ //写卡的命令 #define write_command0 0//写密码 #define write_command1 1//写配置字 #define write_command2 2//密码写数据 #define write_command3 3//唤醒 #define write_command4 4//停止命令 #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR 255 //读卡的时间参数us #define ts_min 250//270*11.0592/12=249//取近似的整数 #define ts_max 304//330*11.0592/12=304 #define t1_min 73//90*11.0592/12=83:-10调整 #define t1_max 156//180*11.0592/12=166 #define t2_min 184//210*11.0592/12=194 #define t2_max 267//300*11.0592/12=276 //***********不采用中断处理:采用查询的方法读卡时关所有中断****************/ sbit p_U2270B_Standby = P3^5;//p_U2270B_Standby PIN=13 sbit p_U2270B_CFE = P3^3;//p_U2270B_CFE PIN=6 sbit p_U2270B_OutPut = P3^7;//p_U2270B_OutPut PIN=2 sbit wtd_sck = P1^7;//SPI总线 sbit wtd_si = P1^3; sbit wtd_so = P1^2; sbit iic_data = P1^2;//lcd IIC sbit iic_clk = P1^7; sbit led_light = P1^6;//测试绿灯 sbit led_light1 = P1^5;//测试红灯 sbit led_light_ok = P1^1;//读卡成功标志 sbit fengmingqi = P1^5; /***********全局变量************************************/ uchar data Nkey_a[4] = {0xA0, 0xA1, 0xA2, 0xA3};//初始密码 //uchar idata card_snr[4]; //配置字 uchar data bankdata[28] = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7}; //存储卡上用户数据(1-7)7*4=28 uchar data cominceptbuff[6] = {1,2,3,4,5,6};//串口接收数组ram uchar command; //第一个命令 uchar command1;// //uint temp; uchar j,i; uchar myaddr = 8; //uchar ywqz_count,time_count; //ywqz jishu: uchar bdata DATA; sbit BIT0 = DATA^0; sbit BIT1 = DATA^1; sbit BIT2 = DATA^2; sbit BIT3 = DATA^3; sbit BIT4 = DATA^4; sbit BIT5 = DATA^5; sbit BIT6 = DATA^6; sbit BIT7 = DATA^7; uchar bdata DATA1; sbit BIT10 = DATA1^0; sbit BIT11 = DATA1^1; sbit BIT12 = DATA1^2; sbit BIT13 = DATA1^3; sbit BIT14 = DATA1^4; sbit BIT15 = DATA1^5; sbit BIT16 = DATA1^6; sbit BIT17 = DATA1^7; bit i_CurrentLevel;//i_CurrentLevel BIT 00H(Saves current level of OutPut pin of U2270B) bit timer1_end; bit read_ok = 0; //缓存定时值,因用同一个定时器 union HLint { uint W; struct { uchar H;uchar L; } B; };//union HLint idata a union HLint data a; //缓存定时值,因用同一个定时器 union HLint0 { uint W; struct { uchar H; uchar L; } B; };//union HLint idata a union HLint0 data b; /**********************函数原型*****************/ //读写操作 void f_readcard(void);//全部读出1~7 AOR唤醒 void f_writecard(uchar x);//根据命令写不同的内容和操作 void f_clearpassword(void);//清除密码 void f_changepassword(void);//修改密码 //功能子函数 void write_password(uchar data *data p);//写初始密码或数据 void write_block(uchar x,uchar data *data p);//不能用通用指针 void write_bit(bit x);//写位 /*子函数区*****************************************************/ void delay_2(uint x) //延时,时间x*10us@12mhz,最小20us@12mhz { x--; x--; while(x) { _nop_(); _nop_(); x--; } _nop_();//WDT_CONTR=0X3C;不能频繁的复位 _nop_(); } ///////////////////////////////////////////////////////////////////// void initial(void) { SCON = 0x50; //串口方式1,允许接收 //SCON =0x50; //01010000B:10位异步收发,波特率可变,SM2=0不用接收到有效停止位才RI=1, //REN=1允许接收 TMOD = 0x21; //定时器1 定时方式2(8位),定时器0 定时方式1(16位) TCON = 0x40; //设定时器1 允许开始计时(IT1=1) TH1 = 0xfD; //FB 18.432MHz 9600 波特率 TL1 = 0xfD; //fd 11.0592 9600 IE = 0X90; //EA=ES=1 TR1 = 1; //启动定时器 WDT_CONTR = 0x3c;//使能看门狗 p_U2270B_Standby = 0;//单电源 PCON = 0x00; IP = 0x10;//uart you xian XXXPS PT1 PX1 PT0 PX0 led_light1 = 1; led_light = 0; p_U2270B_OutPut = 1; } /************************************************/ void f_readcard()//读卡 { EA = 0;//全关,防止影响跳变的定时器计时 WDT_CONTR = 0X3C;//喂狗 p_U2270B_CFE = 1;// delay_2(232); //>2.5ms /* // aor 用唤醒功能来防碰撞 p_U2270B_CFE = 0; delay_2(18);//start gap>150us write_bit(1);//10=操作码读0页 write_bit(0); write_password(&bankdata[24]);//密码block7 p_U2270B_CFE =1 ;// delay_2(516);//编程及确认时间5.6ms */ WDT_CONTR = 0X3C;//喂狗 led_light = 0; b.W = 0; while(!(read_ok == 1)) { //while(p_U2270B_OutPut);//等一个稳定的低电平?超时判断? while(!p_U2270B_OutPut);//等待上升沿的到来同步信号检测1 TR0 = 1; //deng xia jiang while(p_U2270B_OutPut);//等待下降沿 TR0 = 0; a.B.H = TH0; a.B.L = TL0; TH0 = TL0 = 0; TR0 = 1;//定时器晚启动10个周期 //同步头 if((324 < a.W) && (a.W < 353)) ;//检测同步信号1 else { TR0 = 0; TH0 = TL0 = 0; goto read_error; } //等待上升沿 while(!p_U2270B_OutPut); TR0 = 0; a.B.H = TH0; a.B.L = TL0; TH0 = TL0 = 0; TR0 = 1;//b.N1<<=8; if(a.B.L < 195);//0.5p else { TR0 = 0; TH0 = TL0 = 0; goto read_error; } //读0~7块的数据 for(j = 0;j < 28;j++) { //uchar i; for(i = 0;i < 16;i++)//8个位 { //等待下降沿的到来 while(p_U2270B_OutPut); TR0 = 0; a.B.H = TH0; a.B.L = TL0; TH0 = TL0 = 0; TR0 = 1; if(t2_max < a.W/*)&&(a.W < t2_max)*/)//1P { b.W >>= 2;//先左移再赋值 b.B.L += 0xc0; i++; } else if(t1_min < a.B.L/*)&&(a.B.L < t1_max)*/)//0.5p { b.W >>= 1; b.B.L += 0x80; } else { TR0 = 0; TH0 = TL0 = 0; goto read_error; } i++; while(!p_U2270B_OutPut);//上升 TR0 = 0; a.B.H = TH0; a.B.L = TL0; TH0 = TL0 = 0; TR0 = 1; if(t2_min < a.W/*)&&(a.W < t2_max)*/)//1P { b.W >>= 2; i++; } else if(t1_min < a.B.L/*a.W)&&(a.B.L < t1_max)*/)//0.5P //else if(!(a.W==0)) { b.W >>= 1; //temp+=0x00; //led_light1=0;led_light=1;delay_2(40000); } else { TR0 = 0; TH0 = TL0 = 0; goto read_error; } i++; } //取出奇位 DATA = b.B.L; BIT13 = BIT7; BIT12 = BIT5; BIT11 = BIT3; BIT10 = BIT1; DATA = b.B.H; BIT17 = BIT7; BIT16 = BIT5; BIT15 = BIT3; BIT14 = BIT1; bankdata[j] = DATA1; } read_ok = 1;//读卡完成了 read_error: _nop_(); } } /***************************************************/ void f_writecard(uchar x)//写卡 { p_U2270B_CFE = 1; delay_2(232); //>2.5ms //psw=0 standard write if (x == write_command0)//写密码:初始化密码 { uchar i; uchar data *data p; p = cominceptbuff; p_U2270B_CFE = 0; delay_2(31);//start gap>330us write_bit(1);//写操作码1:10 write_bit(0);//写操作码0 write_bit(0);//写锁定位0 for(i = 0;i < 35;i++) { write_bit(1);//写数据位1 } p_U2270B_CFE = 1; led_light1 = 0; led_light = 1; delay_2(40000);//测试使用 //write_block(cominceptbuff[4],p); p_U2270B_CFE = 1; bankdata[20] = cominceptbuff[0];//密码存入 bankdata[21] = cominceptbuff[1]; bankdata[22] = cominceptbuff[2]; bankdata[23] = cominceptbuff[3]; } else if (x == write_command1)//配置卡参数:初始化 { uchar data *data p; p = cominceptbuff; write_bit(1);//写操作码1:10 write_bit(0);//写操作码0 write_bit(0);//写锁定位0 write_block(cominceptbuff[4],p); p_U2270B_CFE= 1; } //psw=1 pssword mode else if(x == write_command2) //密码写数据 { uchar data*data p; p = &bankdata[24]; write_bit(1);//写操作码1:10 write_bit(0);//写操作码0 write_password(p);//发口令 write_bit(0);//写锁定位0 p = cominceptbuff; write_block(cominceptbuff[4],p);//写数据 } else if(x == write_command3)//aor //唤醒 { //cominceptbuff[1]操作码10 X xxxxxB uchar data *data p; p = cominceptbuff; write_bit(1);//10 write_bit(0); write_password(p);//密码 p_U2270B_CFE = 1;//此时数据不停的循环传出 } else //停止操作码 { write_bit(1);//11 write_bit(1); p_U2270B_CFE = 1; } p_U2270B_CFE = 1; delay_2(560);//5.6ms } /************************************/ void f_clearpassword()//清除密码 { uchar data *data p; uchar i,x; p = &bankdata[24];//原密码 p_U2270B_CFE = 0; delay_2(18);//start gap>150us //操作码10:10xxxxxxB write_bit(1); write_bit(0); for(x = 0;x < 4;x++)//发原密码 { DATA = *(p++); for(i = 0;i < 8;i++) { write_bit(BIT0); DATA >>= 1; } } write_bit(0);//锁定位0:0 p = &cominceptbuff[0]; write_block(0x00,p);//写新配置参数:pwd=0 //密码无效:即清除密码 DATA = 0x00;//停止操作码00000000B for(i = 0;i < 2;i++) { write_bit(BIT7); DATA <<= 1; } p_U2270B_CFE = 1; delay_2(560);//5.6ms } /*********************************/ void f_changepassword()//修改密码 { uchar data *data p; uchar i,x,addr; addr = 0x07;//block7 p = &Nkey_a[0];//原密码 DATA = 0x80;//操作码10:10xxxxxxB for(i = 0;i < 2;i++) { write_bit(BIT7); DATA <<= 1; } for(x = 0;x < 4;x++)//发原密码 { DATA = *(p++); for(i = 0;i < 8;i++) { write_bit(BIT7); DATA >>= 1; } } write_bit(0);//锁定位0:0 p = &cominceptbuff[0]; write_block(0x07,p);//写新密码 p_U2270B_CFE = 1; bankdata[24] = cominceptbuff[0];//密码存入 bankdata[25] = cominceptbuff[1]; bankdata[26] = cominceptbuff[2]; bankdata[27] = cominceptbuff[3]; DATA = 0x00;//停止操作码00000000B for(i = 0;i < 2;i++) { write_bit(BIT7); DATA <<= 1; } p_U2270B_CFE = 1; delay_2(560);//5.6ms } /***************************子函数***********************************/ void write_bit(bit x)//写一位 { if(x) { p_U2270B_CFE = 1; delay_2(32);//448*11.0592/120=42延时448us p_U2270B_CFE = 0; delay_2(28);//280*11.0592/120=26写1 } else { p_U2270B_CFE = 1; delay_2(92);//192*11.0592/120=18 p_U2270B_CFE = 0; delay_2(28);//280*11.0592/120=26写0 } } /*******************写一个block*******************/ void write_block(uchar addr,uchar data *data p) { uchar i,j; for(i = 0;i < 4;i++)//block0数据 { DATA = *(p++); for(j = 0;j < 8;j++) { write_bit(BIT0); DATA >>= 1; } } DATA = addr <<= 5;//0地址 for(i = 0;i < 3;i++) { write_bit(BIT7); DATA <<= 1; } } /*************************************************/ void write_password(uchar data *data p) { uchar i,j; for(i = 0;i < 4;i++)// { DATA = *(p++); for(j = 0;j < 8;j++) { write_bit(BIT0); DATA >>= 1; } } } /*************************************************/ void main() { initial(); TI = RI = 0; ES = 1; EA = 1; delay_2(28); //f_readcard(); while(1) { f_readcard(); //读卡 f_writecard(command1); //写卡 f_clearpassword(); //清除密码 f_changepassword(); //修改密码 } }
标签: 12345
上传时间: 2017-10-20
上传用户:my_lcs
多关节机器人在工业上已经得到了非常广泛的应用,并且以后会用在越来越多的其他领域。多轴控制系统作为多关节机器人的核心,发展也十分迅速。传统的多轴控制器体积比较庞大,扩展性不好。在工业4.0的时代,多轴控制系统也越来越智能,同时体积也在逐步减小,并且能够联网。EtherCAT现场总线是一种新兴工业实时以太网总线,经过多年的技术发展,在通讯速度,拓扑结构等领域已经具有非常独特的优势。本课题的工作主要是将EtherCAT现场总线技术应用在多轴控制系统中,利用其技术优势,进一步提高多轴控制器的扩展性和灵活性,使控制系统网络化。 本研究首先分析了多轴控制系统的现状以及发展趋势,介绍了EtherCAT现场总线技术,在此基础上,确立了多轴控制系统的开发架构以及开发方法。然后,课题设计完成了基于ET1100的通讯板。在此通讯板的基础上,使用STM32单片机作为EtherCAT应用层控制芯片,设计并完成了数字输入输出部分和模拟输入输出部分的软硬件。同时,为了达到工业现场的要求,设计着重考虑了安装的便利性,热插拔功能以及抗干扰性。接着,课题以实验室雕刻机为控制对象,以PC机作为EtherCAT主站,在主站上的TwinCAT软件中设计实现了雕刻机的正逆运动学算法,并设计实现人机界面。同时,课题使用ADS通讯接口与C#高级语言进行通讯,实现了数据的交互。为了更加方便实现人机交互,课题也基于.NET架构设计了人机界面,这样方便Windows平台对多轴系统的直接或者远程控制。最后,在雕刻机平台上对设计的多轴控制系统进行调试和实验,同时对多轴之间的同步性能进行测试,完成了雕刻机的单轴运动,点动运动,多轴联动以及示教运动,并且多轴之间的实时性在微秒级。
上传时间: 2022-05-29
上传用户:qingfengchizhu
在传统的数据传输及工业自动化控制领域,有成千上万的数据采集、通信和自动控制设备都是利用Meter Bus总线、CAN总线等进行数据通信、数据交换和数据管理的。虽然Meter Bus总线、CAN总线都具有一些先天性的优势。诸如低功耗、造价低廉、设计简单、应用广泛等特点。但是,随着社会需求的发展,稳定、大流量、长距离、高速度、高集成度、交互性强和资源共享的系统成为必然,从而使得单纯的Meter bus总线通信或者CAN总线通信不能满足社会的需求。同时,随着互联网的迅猛发展,支持TCP/IP协议的以太网的功能得到了极大的完善,并且已经延伸到社会的各个角落。与Meter Bus总线通信和CAN总线通信相比较,TCP/IP网络是基于复杂环境设计的,具有自动纠错功能,通信质量稳定。目前100M已经是TCP/IP网络的标准配置,1000M也在快速的普及当中,这么快的传输速度是Meter Bus总线通信和CAN总线通信所无法达到的。而且,TCP/IP网络的开放性非常强,只要接入互联网,通信距离就可以无限延长,从而可以实现最大限度的信息和资源共享。基于此,充分利用Meter Bus总线通信和CAN总线通信的优势,同时与开放的TCP/IP网络衔接,正是目前国内外测控技术研究的重点,我们把它称为网络化的测控技术。本文基于嵌入式Linux系统,设计并实现了Meter Bus总线和CAN总线与TCP/IP网络的通信转换网关,完成了Meter Bus总线和CAN总线与TCP/IP网络的数通,V1
标签: 嵌入式 linux 以太网 can mbus 现场总线 通信网关
上传时间: 2022-06-21
上传用户:
本文论述了车载仪表系统的发展,对新型的车载仪表用步进电机驱动控制技术和基于现场总线通信协议的车载仪表技术进行了深入的研究,并在此基础上开发了基于GDIC的车载仪表用步进电机驱动控制平台,搭建了基于CAN总线的车载仪表通讯系统.在仪表用步进电机控制测试平台中,系统选用MC33991实现步进电机驱动控制,通过SPI通讯协议完成和主处理器之间的数据传输,采用∑-△ ADC方案检测EMF从而实现电机整步位置的判断.本文介绍了基于CAN总线的车载仪表通信系统,阐述了构成该系统的硬件设计、软件设计.
上传时间: 2013-04-24
上传用户:是王洪文
漏电是井下供电系统的主要故障形式,约占其总故障的70%左右,它不但导致人身触电事故,还会形成单相接地,进而发展成为相间短路,由此引发的电弧会造成瓦斯和煤尘爆炸。漏电保护器主要用来防止漏电火灾造成的经济损失和人身伤亡,因此得到广泛应用。 选择性漏电保护是指当电网发生漏电故障时,能够有选择地发出故障信号或切断故障支路电源,而非故障部分继续工作。从而减小故障停电范围,便于寻找漏电故障,缩短漏电停电时间,提高了供电的可靠性。 目前的矿井电网的选择性漏电保护系统主要采用零序电流大小及零序电流方向保护原理,这种原理在某一线路远远长于其他线路(即其分布电容与系统总的分布电容相差不大时)的情况下较难满足选择性的要求,保护装置可能发生拒动现象,不能很好的完成保护的目的。 本文在对井下电网漏电故障理论分析和仿真验证的基础上,提出了以dsPIC30F4012为核心,基于附加直流电源检测和零序功率方向的选择性漏电保护方案,介绍了基于这种选择性漏电保护方案的电网选择性漏电保护装置。该装置在总馈电开关处的漏电保护装置使用附加直流电源原理,在分支馈电开关处的漏电保护装置使用零序功率方向式保护原理,并且采用速度更快的PROFIBUS协议现场总线及光纤传输技术,使该选择性漏电保护装置的动作性能和抗干扰能力得到很大提升。
上传时间: 2013-06-13
上传用户:hongmo
基于现场总线的网络技术研究是自动控制领域发展的一个热点。在各种工业现场总线中,CAN总线以其成本低、速度快、实时性和可靠性较高等特点被广泛应用于各领域。CIA(CAN in Automation)协会发布了完整的CANopen协议,定义了应用层和通讯子协议,为基于现场总线的分布式控制系统的广泛应用提供了解决之道。 本文研究国内外现场总线发展现状后,以改善现场总线网络通讯系统的运行效率,提高实时性和信息处理能力为前提,浅析CAN总线高层通讯协议CANopen,分析了主、从节点的各个功能,说明了功能的设计和实现方案。 然后,本文将CANopen协议应用于分布式控制系统,详细论述了基于PIC18控制器的从节点和基于DSP控制器的主节点的实现过程。主、从节点具有基于CANopen协议的总线通信功能。从节点具有数字量和模拟量输入输出功能。主节点可以通过键盘对各节点运行状态和各节点参数进行调整,还可以通过液晶屏显示实时控制量和各节点运行状态。PC机能在线监测CAN报文数据流。本文对两种类型节点的设计思想、硬件组成和软件设计均做了详尽的阐述,并给出了部分关键硬件原理图和软件流程图。 最后,把已开发的从节点和主节点组成一个温度测控系统和一个电机控制系统。经过实验室测试,证明系统具有良好的实时性,通讯稳定可靠,解决了传统CAN总线节点通讯可控性差,无法灵活设置的问题。对目前国内CAN总线应用中大多把精力放在硬件之上的底层软件开发,少有使用上层软件协议的习惯,起到了一定的推动意义,提高了应用水平。
上传时间: 2013-04-24
上传用户:569342831
社会发展对内燃机车柴油机安全、节能、低污染等方面提出了更高的要求,传统的机械式控制已很难满足这些新要求。对机车柴油机采用电子控制技术成为当前提高柴油机乃至整车性能的一种有效方法。柴油机电子控制技术包含的范围很广,其中标定技术决定了电控系统中最佳控制参数的获取,从而影响着柴油机的工作性能,而喷油泵特性的标定是标定众多内容中首先要解决的问题,因此本文将机车柴油机电控系统中的油量特性标定作为研究重点,首先对电控单体泵的组成和原理进行了分析,确定了其作为机车应用的合理性;其次完成了电子燃油喷射控制单元的设计,并对其实验方法进行了研究。 喷油泵在匹配任何一种类型柴油机之前,其数学模型和控制特性应该基本确定,能不能使得被匹配的柴油机性能达到最佳水平,将取决于能否通过有效的标定方法来获得准确的喷油控制参数。本文在电子控制单元基本功能完成的基础上,充分利用现场总线技术的优势,在实现物理层和数据链路层接口的同时,针对标定应用进行了扩展,制订出一套完整的通信协议,并开发出上位机标定软件,使得电子控制单元与上位机之间建立起了良好的通信平台。标定系统的建立同时为机车故障诊断技术带来了新思路,本文提出了一种基于分布式机车控制网络的故障诊断策略,多个智能化节点可以共同来完成复杂的故障诊断操作,性能完备的网络构成和通讯协议使得大量故障信息的交互显得有条不紊。这种思路,对电控系统乃至整车的故障诊断技术的发展产生着深远的影响。 方案的确定,软硬件的设计,实验方法的分析,都必须结合真正的台架实验,在实验过程中不断的改进。本文最后,介绍了在机车厂单体泵试验台上进行的电磁阀驱动和油泵特性标定实验,从中获得了机车柴油机电控系统研究的宝贵经验,为后期的柴油机匹配实验打下了坚实的基础。
上传时间: 2013-04-24
上传用户:mylinden
通信与自动控制技术结合产生的远程数据传输技术,已经成为当前研究的一个热点。以数据传输技术为核心的远程无线监控系统已广泛应用于交通、电力、工农业、水利、环保、建筑、能源等行业中需要无人值守监控维护的地方,监控情况,以及传输的数据存在着突发性、数据量少等特点。传统的远程监控技术多采基于现场总线的方式接入Internet,在接入端需要搭建本地局域网平台和监控系统,对于环境依赖性比较强,容易造成地域局限性。 文章围绕无线数据传输方式这一热点课题,介绍了国内外在远程数据传输方面的发展与现状,对GSM短消息在远程数据传输中的应用进行了深入的研究和探讨.接着,阐述了相应的GSM无线终端的设计方案、开发方法和开发过程,并针对小数据量的无线数据传输领域,提出了应用以短消息业务作为数据传送载体的数与车载防盗报警系统相结合,设计了以DPSD微处理器和GSM模块TC35i为核心,基于GSM/SMS的车载防盗报警系统。接着,给出基于GSM/SMS无线数据传输技术的车载防盗报警系统的具体实现过程,包括各硬件模块的设计原理、电路原理图文重点包括以下两个方面: l.对GSM/SMS的工作原理及协议做了详细的研究,并运用于小数据量的无线数据传输中。 2.设计了基于SMS的车载防盗报警系统,给出了硬件原理图及软件流程。 基于SMS的车载防盗报警系统已经在市场上得到印证,应用结果表明,该系统使用操作方便,数据通信准确、稳定、可靠、高效,具有较高的实用价值。
上传时间: 2013-04-24
上传用户:wff
CAN的源码 CAN源程序 c51单片机 sja1000控制器 自己写的
上传时间: 2013-05-17
上传用户:qiaoyue