发表于: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[--] [中断返回]
...............................................................