中国人的z893要与德国人的CAN一较高低之五 点击:1212 | 回复:0



米d.

    
  • 精华:3帖
  • 求助:0帖
  • 帖子:8帖 | 61回
  • 年度积分:0
  • 历史总积分:99
  • 注册:2003年8月30日
发表于:2003-09-05 12:44:00
楼主
z893与CAN 不一样的是, 除定义了4个字节的[高速信息通道]外, 它还定义了一个256字节的[显示信息通道], 从而将共亨广播的功能发展到顶点。 这256个字节的位置设定在:0100-01FFh, 并且也组态到[引导帧]的固定位置, 即引导码的第2-3字节, 前为地址,后为数据, 每次只传送1个字节, 256个周期循环一个重复。 前章我们谈到, [高速信息通道]占用了[引导帧]的第4-7字节, 现在加上[显示信息通道]的第2-3字节, 还差第一字节。 z893约定, 每个[引导帧]的首字节为当前允许占用总线的[IP]地址, 即emdos中称之为[工作站的设备号]。 由于只有一个字节, 因此它的最大设计总量为256。 z893约定, 任何工作站, 只要你能在7个字节的[引导帧]周期时间之内, 正确地向服务器提交5个字节的申请, emdos将会响应你的命令而完成相应的操作, 否则将强行转换到下一个[引导帧]。 emdos允许一个工作站使用多个[设备号], 或者是多个线程共用一个[设备号], 所带来的好处是: (1)优先级高的线程可以使用较多的[IP]地址, 从而获得较多的服务,这一点上与CAN 有较大的差别。 (2)将那些不守规举的家伙[指软件上含有虫子的工作站], 清除出去,以免总线被长期占用,影响到全体的安全。 z893约定, 工作站回答服务器的5个字节顺序分别为: [/设备号][操作码][H地址][L地址][长度or数据D]。 z893约定, 这5个字节要求在[引导帧]的最后一个字节输出完之前, 必须实时地通过串行总线提交给服务器, 前后只有一个字节的允许[偏差], 这就注定它将必须采用[全双工流水线]方式, 是目前现场总线中要求响应最快的协议。 这一切对于用户的应用编程来讲, 并不需要多加考虑, 那是[软猫]的事,除非你是一个[猫迷]。 [开个玩笑!] 为了加深对它的理解,我们下面结合一个实例看看, 某[老总]的老乡是一个房地产开发商的老板, 他希望[老总]为他提供一套备有互联网带控制的高层楼房恒压供水设备, 要求采用的方案有: (1)水压采集点为50层大楼的顶层, (2)水泵控制点为地下室的最底层, (3)操作室为10层的微机房内, (4)采用光纤连结。 出于老乡的面子, 接下了合同。 [中国人讲究的就是面子!] *********************************************** 软件工程师接到这个任务之后,他将按下列流程编程及设计: (1)z893采用与pc.com口完全一样的串行标准, 可以兼容光纤连结器,买现成的集线器即可。 (2)操作平台采用win98me,互联网就不存在问题。 (3)约定当地址=0100h单元的d0由0变为1, 启动A/D采集。 (4)约定当地址=0100h单元的d0由1变为0, A/D采集完毕, 水压值存放0108h,0109h单元。 (5)约定当地址=0100h单元的d1由0变为1, 启动水泵,反之关闭; 变频调速的D/A值由010ah,010bh单元提供。 (6)当[启动]按扭按下后执行下面程序即可: [注:仅提供功能部分的程序] //启动A/D [用Delphi5.0汇编语言编写的这段程序。] asm lea ebp,d1300 mov al,08h mov [ebp+1],al //操作码=08[开] mov al,01h mov [ebp+2],al //地址H=01h mov al,00h mov [ebp+3],al //地址L=00h mov al,01h mov [ebp+4],al //D=0000 0001 mov al,00h mov [ebp+5],al //in:长度=00h mov al,00h mov [ebp+6],al //out:长度=00h call a100 //[注]软猫子程序:启动交换[0100h单元的D0=1] end; //等待A/D结束 [用Delphi5.0汇编语言编写的这段程序。] asm mov ecx,7ffffh //置看门狗定时=0.5秒 @@01: call b100 //软猫子程序2:采集引导帧,7字节数据存d1000[0][1]...[6] lea ebp,d1000 mov al,[ebp+3] //取[高速信息通道]#0100 and al,01h //解读a/d模块的指令 cmp al,01h jnz @@02 //0100h单元的d0=0,A/D采集完毕,水压值存放0108h,0109h单元; loop @@01 //d0=1 看门狗定时-1循环 jmp xxxx //ecx=0超时报井[省略] @@02: end; //取水压值 [用Delphi5.0汇编语言编写的这段程序。] asm lea ebp,d1300 mov al,01h mov [ebp+1],al //操作码=01[读] mov al,01h mov [ebp+2],al //地址H=01h mov al,08h mov [ebp+3],al //地址L=08h mov al,02h mov [ebp+4],al //[长度]=02h mov al,02h mov [ebp+5],al //in:长度=02h mov al,00h mov [ebp+6],al //out:长度=00h call a100 //[注]软猫子程序:启动交换[水压值存d1400[0][1]] end; //校正 [用Delphi5.0高级语言编写的这段程序。] d1500[0]:=(d1400[0]校正); //***有各种方法求出水泵的工作速度.[省略] d1500[1]:=(d1400[1]校正); //***有各种方法求出水泵的工作速度.[省略] //置水泵速度 [用Delphi5.0高级语言编写的这段程序。] d1300[1]:=02h; //操作码=02h[写] d1300[2]:=01h; //地址H=01h d1300[3]:=0ah; //地址L=0ah d1300[4]:=02h; //长度=02h d1300[5]:=00h; //in:长度=00h d1300[6]:=02h; //out:长度=02h a100; //[注]软猫子程序:启动交换[D/A值写入010ah,010bh单元] //启动水泵: [用Delphi5.0汇编语言编写的这段程序。] asm lea ebp,d1300 mov al,08h mov [ebp+1],al //操作码=08[开] mov al,01h mov [ebp+2],al //地址H=01h mov al,00h mov [ebp+3],al //地址L=00h mov al,02h mov [ebp+4],al //D=0000 0010 mov al,00h mov [ebp+5],al //in:长度=00h mov al,00h mov [ebp+6],al //out:长度=00h call a100 //[注]软猫子程序:启动交换[0100h单元的D1=1] end; *********************************************** 硬件工程师(甲)接到这个任务之后,他将按下列流程编程: (1)假定[A/D]执行的cpu模块为51系列兼容的ADUC812。 (2)ADUC812_A/D采用中断方式。 下面用ICExplorer.51汇编语言编写这段程序: [注]ADUC812在win98me下编程,COM1口远程直接下载,不要编程器。 ............................................................... ORG 0033H ; ADUC812_A/D 转换结束入口 em0033: MOV 06H, 0D9H ;2[06][D9] ADC_L MOV 07H, 0DAH ;2[07][DA] ADC_H RETI ;2[--] [中断返回] ...............................................................


热门招聘
相关主题

官方公众号

智造工程师