1、华东理工大学自动化系现场总线控制系统现场总线控制系统第第3讲讲 Neuron C 语言与语言与I/O对象对象 信息学院自动化系信息学院自动化系 凌志浩凌志浩内容简介内容简介1 Neuron C 1 Neuron C 简介简介2 Neuron C 2 Neuron C 编程及技巧编程及技巧3 3 节点间通信节点间通信3.1 3.1 网络变量网络变量3.2 3.2 显示报文显示报文4 4 输入输出对象输入输出对象华东理工大学自动化系1 Neuron C 1 Neuron C 简介简介 Neuron Neuron芯片的应用程序是用芯片的应用程序是用Neuron CNeuron C编写的编写的 。 N
2、euron CNeuron C是建立在是建立在ANSI CANSI C的基础上的,与之相比有如的基础上的,与之相比有如下下三方面三方面扩展功能:扩展功能: (1)一种新的语句类型一种新的语句类型whenwhen,引入事件并定义任务事件的,引入事件并定义任务事件的执行顺序。执行顺序。 (2)新增加了新增加了3737种数据类型,种数据类型,3434种输入种输入/ /输出对象,输出对象,2 2个定个定时器时器/ /计数器对象,大大简化了设备控制器的用法计数器对象,大大简化了设备控制器的用法。(3)网络变量的内部消息传送机制和其他消息处理机制网络变量的内部消息传送机制和其他消息处理机制 。 它是将程序
3、样例建立在事件上的。也即应用程序是被它是将程序样例建立在事件上的。也即应用程序是被发生在网络当中或指定设备上的事件所触发的。因此网络发生在网络当中或指定设备上的事件所触发的。因此网络自己是被事件驱动的。自己是被事件驱动的。 华东理工大学自动化系1.1 1.1 对对ANSI C ANSI C 的扩展包括的扩展包括(1)一个内部多任务调度程序,它允许程序员以自然的方式描述一个内部多任务调度程序,它允许程序员以自然的方式描述事件驱动的任务,同时控制这些任务的优先级的执行。事件驱动的任务,同时控制这些任务的优先级的执行。 (2)将将I/O对象直接映射到处理器的对象直接映射到处理器的I/O能力能力。(3
4、)网络变量对象定义:提供一种简单的实现节点之间数据共享网络变量对象定义:提供一种简单的实现节点之间数据共享的方法。的方法。 (4)when语句:引入事件并定义这些事件所对应的任务。语句:引入事件并定义这些事件所对应的任务。 (5)显式消息传递显式消息传递( explicit message ):用于直接对:用于直接对LonTalk协议的底层进行访问。协议的底层进行访问。(6)秒及毫秒级软件定时器对象。秒及毫秒级软件定时器对象。 (7)函数库:当调用时,可以执行事件检查、管理输入函数库:当调用时,可以执行事件检查、管理输入/输出、输出、网上发送或接收消息以及控制网上发送或接收消息以及控制Neur
5、on芯片的各种功能。芯片的各种功能。(8)Neuron C中有中有三个三个ANSI包含文件包含文件:、 。华东理工大学自动化系1.2 Neuron C 1.2 Neuron C 支持的变量的类型支持的变量的类型(1) 整型(整型常数或整型变量)整型(整型常数或整型变量) int 、short int、long int、unsinged int 、signed(可省略可省略) int (2)字符型(字符型常数或字符型变量)字符型(字符型常数或字符型变量) unsigned char(8unsigned char(8位位) )、 signed char (8signed char (8位位) )
6、(3) typedef enum FALSE、TRUE boolean (4)其他其他 华东理工大学自动化系1.3 Neuron C 1.3 Neuron C 变量定义变量定义(1)Neuron C(1)Neuron C和和ANSI CANSI C支持的变量定义如下支持的变量定义如下简单的数据类型简单的数据类型 int a,b,c ;char a;数据类型数据类型 typedef unsigned long ULONG; 枚举枚举 enum hueRED,GREEN,BLUE 指针指针 char *p; 函数函数 int f(int a, int b) 数组数组 int a4 结构和共用体结构
7、和共用体 struct char name10; int age; char addr10; 华东理工大学自动化系(2 2)Neuron CNeuron C中附加定义的对象中附加定义的对象I/O对象:对象: IO_0 output bit alarm 定时器:定时器: mtimer led_on_timer 网络变量:网络变量:network input int net_is_car 消息标签:消息标签:msg_tag command 华东理工大学自动化系1.4 1.4 编译指令编译指令 NEURON C允许通过允许通过#pragma编译指令进行编译指令进行编译器扩充。编译器扩充。#pragm
8、a可用来设置一个可用来设置一个Neuron 芯片的系统资源以及节点参数,诸如缓存器数及芯片的系统资源以及节点参数,诸如缓存器数及其大小,接收事务数等。也可用于对特定的其大小,接收事务数等。也可用于对特定的Neuron芯片参数进行控制,这些指令可在源文件芯片参数进行控制,这些指令可在源文件的任何位置出现。的任何位置出现。例:例:#pragma enable_io_pull_ups 可使可使IO4-IO7的上拉使能的上拉使能 华东理工大学自动化系2 Neuron C 2 Neuron C 编程及技巧编程及技巧 2.1 2.1 调度程序调度程序 Neuron Neuron 芯片的任务调度是由事件驱动
9、的:芯片的任务调度是由事件驱动的:当一个给定的条件判断为当一个给定的条件判断为“真真”时,与该事件有时,与该事件有关的代码被执行关的代码被执行( (称为任务被执行称为任务被执行) )。调度程序允。调度程序允许定义任务,该任务作为特定事件的结果而被运许定义任务,该任务作为特定事件的结果而被运行,如:输入管脚的改变、接收一个网络变量的行,如:输入管脚的改变、接收一个网络变量的新值、或定时器溢出等。也可以指定某些任务是新值、或定时器溢出等。也可以指定某些任务是具有优先级的任务,以便能得到优先服务。具有优先级的任务,以便能得到优先服务。 华东理工大学自动化系(1 1) whenwhen语句语句 事件由
10、事件由when语句来定义,语句来定义,when语句包含一个表达语句包含一个表达式,当表达式为真时,表达式后面的代码段被执行式,当表达式为真时,表达式后面的代码段被执行。 例:例:when(timer_expires(led_timer) /当定时器溢出时执行下列任务当定时器溢出时执行下列任务 io_out(io_led,OFF); 在 任 务 执 行 后 , 时 间 溢 出 事 件 被 清 除 。 当在 任 务 执 行 后 , 时 间 溢 出 事 件 被 清 除 。 当led_timer再次溢出,再次溢出,when子句判断为真,任务又将执子句判断为真,任务又将执行;否则,任务被忽略。行;否则,
11、任务被忽略。华东理工大学自动化系A. A. 多个多个whenwhen子句可与一个任务发生关联子句可与一个任务发生关联when(reset)when(io_change(io_switch)when(!timer_expires)when(x= =3) .华东理工大学自动化系B. whenB. when子句子句不能嵌套不能嵌套如下为错误:如下为错误: when(io_changes(io_switch) when(x= =3) . 华东理工大学自动化系 ()()whenwhen子句语法子句语法priority prompt_safe when(event) taskpriority(优先级优先级
12、) :可选择项可选择项 prompt_safe:可选项,如使用即便应用程序处于占先模可选项,如使用即便应用程序处于占先模式,仍然允许调度程序执行相关的式,仍然允许调度程序执行相关的when任务任务 。event:可是预定的事件也可是有效的可是预定的事件也可是有效的 Neuron C 表达式。表达式。tasktask:是是Neuron Neuron 的复合语句,任务同的复合语句,任务同voidvoid函数体等同函数体等同, ,也即它不能返回一个值也即它不能返回一个值. .华东理工大学自动化系()()whenwhen语句中的事件类型语句中的事件类型分为两种:预定义事件和用户定义事件分为两种:预定义
13、事件和用户定义事件预定义事件:预定义事件:使用编译器内部固有的关键字使用编译器内部固有的关键字, ,包括输入引脚状包括输入引脚状态变化、网络变量修改、定时器溢出以及消息的接收等。态变化、网络变量修改、定时器溢出以及消息的接收等。用户定义事件:用户定义事件:可以是任何有效的可以是任何有效的Neuron CNeuron C表达式。表达式。 例:例: when(msg_arrives) /正确正确 when(online) /正确正确when(msg_arrives & flag = =TURE) /正确正确 华东理工大学自动化系()()whenwhen语句的调度语句的调度 调度程序对一组调度程序对
14、一组when子句的判断过程是一个循环往复子句的判断过程是一个循环往复的过程,每一个的过程,每一个when语句都由调度程序检测,如果为语句都由调度程序检测,如果为真,则与其相关联的任务就被执行。如果真,则与其相关联的任务就被执行。如果when语句为语句为假(假(FALSE),调度程序将继续检查后面的),调度程序将继续检查后面的when语句,语句,在检查完最后一个在检查完最后一个when语句后,调度程序返回顶部重语句后,调度程序返回顶部重复执行上述过程。复执行上述过程。例如:例如: (其中只有为真)(其中只有为真) when()() A when()() B when()() C when()()
15、 D 华东理工大学自动化系()优先级()优先级whenwhen子句子句 如如when子句选用子句选用priority关键字,相比无优先级的关键字,相比无优先级的when子句,调度程序对具有优先级的子句,调度程序对具有优先级的when子句的判断次数要子句的判断次数要频繁的多。优先级频繁的多。优先级when语句在每次调度程序运行时以指语句在每次调度程序运行时以指定的顺序被检查。如果任何优先级定的顺序被检查。如果任何优先级when语句被检测为真,语句被检测为真,则与它相对应的任务就被执行,然后调度程序又重新回则与它相对应的任务就被执行,然后调度程序又重新回到优先级到优先级 when语句队列头,从头开
16、始检测优先级语句队列头,从头开始检测优先级when语语句。句。 使用优先级使用优先级when语句必须仔细考虑。因为优先级语句必须仔细考虑。因为优先级when语句太多的话,将使无优先级的语句太多的话,将使无优先级的when语句根本没机会执语句根本没机会执行。如果一个优先级行。如果一个优先级when语句在大部分时间里都为真,语句在大部分时间里都为真,则它将独占处理器时间。则它将独占处理器时间。华东理工大学自动化系华东理工大学自动化系()预定义事件关键字()预定义事件关键字 flush_completes 、 offline 、 online 、 wink、io_changes、 io_in_rea
17、dy、io_out_ready、reset、timer_expires、io_update_occurs、msg_arrives、m s g _ c o m p l e t e s 、 n v _ u p d a t e _ f a i l s 、nv_update_succeeds等等。等等。 预定义事件还可以作为子表达式放置在预定义事件还可以作为子表达式放置在if 、while 、for语句语句的控制表达式中,这种方法称为的控制表达式中,这种方法称为直接事件处理。直接事件处理。 例:例: mtimer t; when(event) if(timer_expires(t) io_out(io
18、_led,OFF); 华东理工大学自动化系2.2 2.2 定时器定时器Neuron 可以使用两种类型的软件定时器对象:可以使用两种类型的软件定时器对象:毫秒定时器和秒定时器。毫秒定时器和秒定时器。 毫秒定时器毫秒定时器提供一个计时范围为提供一个计时范围为164000毫秒的毫秒的定时器。定时器。 秒定时器秒定时器提供一个计时范围为提供一个计时范围为 165535秒的定秒的定时器。时器。 它们和它们和Neuron芯片上两个硬件定时器计时器芯片上两个硬件定时器计时器无关,无关,由网络处理器实现(由网络处理器实现(1515个)个)。 华东理工大学自动化系( () ) 定时器的定义定时器的定义 mtim
19、er repeating timer-name= initial-value 毫秒定时器毫秒定时器 stimer repeating timer-name=initial-value 秒定时器秒定时器repeating: 为可选项,如果定时器溢出,定时器将自动为可选项,如果定时器溢出,定时器将自动开始重新计时。使用该选项,即使应用不能立即响应该开始重新计时。使用该选项,即使应用不能立即响应该终止事件,精确的时间间隔也能够被保留。终止事件,精确的时间间隔也能够被保留。timer-name:为定时器指定的名字为定时器指定的名字init-value: 为可选项,指定当加电或者复位时赋给定时为可选项,
20、指定当加电或者复位时赋给定时器的值。如果不提供该初始值,定时器的值被置为器的值。如果不提供该初始值,定时器的值被置为0。华东理工大学自动化系例stimer led_timer; /定义秒定时器定义秒定时器led_timer when(reset) led_timer=5;when(t = =50)led_timer=0; /关闭秒定时器关闭秒定时器华东理工大学自动化系(2 2) 时间溢出事件时间溢出事件语法:语法: timer_expires ( 定时器名定时器名) 定时器名:是可选项,由它来指定所要检查的具体的定时器。定时器名:是可选项,由它来指定所要检查的具体的定时器。如没有该选项,该事件
21、是一个未加限定的如没有该选项,该事件是一个未加限定的timer_expires事件。事件。它与其它预定义事件不同的是,其它的某个挂起事件只为真它与其它预定义事件不同的是,其它的某个挂起事件只为真一次,而对未加限定的一次,而对未加限定的timer_expires事件,只要任何一个定事件,只要任何一个定时器已经终止,未加限定的时器已经终止,未加限定的timer_expires将一直保持为真。将一直保持为真。该事件只有当检测到特定的定时器终止事件时才能被清除该事件只有当检测到特定的定时器终止事件时才能被清除stimer led_timer; when(timer_expires(led_timer)
22、 io_out(io_led,OFF);华东理工大学自动化系 如果程序中有多个定时器,对每个具体的定时器都如果程序中有多个定时器,对每个具体的定时器都要作检查,以便这个终止事件被清除。例如:要作检查,以便这个终止事件被清除。例如:mtimer x;mtimer y;mtimer z;when( timer_expires(x) when(timer_expires(y) when(timer_expires(z) 华东理工大学自动化系另外也可采用如下的方法:另外也可采用如下的方法:when(timer_expires) if(timer_expires(x)else if(timer_expi
23、res(y)else if(timer_expires(z).华东理工大学自动化系2.3 2.3 输入输出输入输出 对未定义的对未定义的I/OI/O引脚也就是不用的引脚,默认为引脚也就是不用的引脚,默认为无效状态,即高阻状态。如果引脚不用,应设计无效状态,即高阻状态。如果引脚不用,应设计上拉电阻,对上拉电阻,对IO4IO7可使用可使用enable_io_pullups编译指令,加上软件实现的上拉电阻。为避免使编译指令,加上软件实现的上拉电阻。为避免使用上拉电阻,用上拉电阻,可将不用的管脚定义为输出管脚。可将不用的管脚定义为输出管脚。为实现为实现I/O,可使用内嵌的,可使用内嵌的I/O函数:函数
24、:io_out( ) 、 io_in( )、 io_select( ) 、 io_select_dirction( ) 、 io_change_init( ) 、io_set_clock( ) 等。等。华东理工大学自动化系(1 1)I/OI/O对象的定义对象的定义说明一个说明一个I/O对象,完成了两件事:对象,完成了两件事:1在哪个或哪几个管脚上将实现什么类型的在哪个或哪几个管脚上将实现什么类型的I/O操作。操作。2 将将I/O对象的名字和硬件连在一起。对象的名字和硬件连在一起。语法:语法: pin type option io-object-name ; pin :IO0IO10中的一个,同
25、一个引脚可以出现在多中的一个,同一个引脚可以出现在多个个 I /O对象定义中对象定义中 type:I/O对象类型:对象类型: 输入或输出输入或输出 option:是可选的是可选的I/O参数,不同参数,不同I/O对象有不同的选项对象有不同的选项华东理工大学自动化系(2(2)定义)定义I/OI/O对象的指导原则对象的指导原则(1) 最多定义最多定义16个个I/O对象对象 (2) Neurowire、I2C、磁卡、磁迹、磁卡、磁迹1以及串行以及串行I/O对象是互对象是互斥的。在一个程序中可以说明一个或多个该组中的某一斥的。在一个程序中可以说明一个或多个该组中的某一种种I/O对象。对象。(3)(3)定
26、时器定时器/计数器对象定义了的引脚不能再定义计数器对象定义了的引脚不能再定义 为移位为移位I/O对象。对象。(4)定时器定时器/计数器计数器1可以有多到可以有多到4个的输入对象供选择个的输入对象供选择(多路复用输入对象)。(多路复用输入对象)。(5)(5)并行和并行和muxbus I/O对象要求使用所有的对象要求使用所有的I/O管脚,任管脚,任何一个这种类型的何一个这种类型的I/O对象被说明后,就不能再说明其对象被说明后,就不能再说明其它它I/O对象类型。对象类型。华东理工大学自动化系(3 3)I/OI/O对象的重叠使用对象的重叠使用可能同一引脚要定义为多种可能同一引脚要定义为多种I/O对象对
27、象例例:IO_4 input nibble io_all_points;IO_4 input bit io_point_1;IO_5 input bit io_point_2;IO_6 input bit io_point_3;IO_7 input bit io_point_4;允许一个程序在同一个操作中读相邻的允许一个程序在同一个操作中读相邻的4个引脚或分别读个引脚或分别读每个引脚(比特每个引脚(比特I/O)。)。 华东理工大学自动化系(4) I/O(4) I/O函数及事件函数及事件 输入对象的访问可以采用两种方法:输入对象的访问可以采用两种方法:1 1显式的调用显式的调用io_in( )函
28、数。函数。2. 2. 判断与该对象有关的事件判断与该对象有关的事件 输出对象的访问方法:输出对象的访问方法: 调用调用io_out( )函数函数华东理工大学自动化系内嵌的内嵌的I/OI/O函数函数io_in ( ) return-value =io_in(io-object-name,args) /从从I/O对象读取数据对象读取数据 io_out ( ) 当信号要发送到某个设备时,当信号要发送到某个设备时,使用使用io_out (io-object-name,output-value,agrs) / 向一个向一个I/O对象写数据对象写数据 华东理工大学自动化系与与I/OI/O有关的事件有关的事
29、件 代替显式调用代替显式调用io_in( )函数的方法函数的方法 使用预定义事件:使用预定义事件: io_changes( ) io_update_occurs( ) 仅 用 于 输 入 对 象仅 用 于 输 入 对 象 , 在 检 测 时 , 在 检 测 时 ,io_update_occurs和和io_changes事件都隐含的事件都隐含的执行执行io_in( )函数,该函数包括对象的输入值。函数,该函数包括对象的输入值。任务可以通过使用关键字任务可以通过使用关键字input_value访问这个访问这个输入值。输入值。华东理工大学自动化系1) io_changes事件事件语法:语法:io_c
30、hanges(io-object-name)by|to exprio_changes(io-object-name)by|to expr 当从当从I/O对象读到的值改变时,该事件判断为真。值的改对象读到的值改变时,该事件判断为真。值的改变有三种类型:变有三种类型: 改变为某指定的值(改变为某指定的值( to ) 至少改变一指定的量(至少改变一指定的量(by 绝对值)绝对值) 任意改变(无限制)任意改变(无限制) 参考值是上次事件判断为真时读取的值,对于无限制参考值是上次事件判断为真时读取的值,对于无限制的的io_changes事件,如果当前值与引用值不同时就意味着事件,如果当前值与引用值不同时
31、就意味着发生了一个状态的改变发生了一个状态的改变. .对于定时器对于定时器/计数器输入设备有一计数器输入设备有一个新的值并且该值与以前的值不同时,个新的值并且该值与以前的值不同时,io_changes事件才事件才发生。发生。华东理工大学自动化系IO_0 input bit push_button;when(io_changes(push_button) to 0)IO_7 input pulsecount total_ticks;when(io_changes(total_ticks) by 100)例华东理工大学自动化系对于定时器对于定时器/计数器对象,计数器对象,io_changes事件发
32、生于:事件发生于:双斜率输入:双斜率输入:转换完成时事件发生转换完成时事件发生定期及周期输入:定期及周期输入:如果测量时间与上次测量时间相如果测量时间与上次测量时间相比已发生改变时事件发生。比已发生改变时事件发生。脉冲计数输入:脉冲计数输入:如果脉冲计数的值与上次计数相比如果脉冲计数的值与上次计数相比已发生改变,则事件发生。已发生改变,则事件发生。华东理工大学自动化系2)io_update_occurs事件事件 语法:语法: io_update_occurs (io-object-name) 当输入对象当输入对象(io-object-name)读取的值发生读取的值发生改变时,改变时,io_up
33、date_occurs事件为真。该事件为真。该事件事件只能用在某些定时器只能用在某些定时器/计数器的输入计数器的输入对象中对象中。对事件的定时依赖于输入对象的。对事件的定时依赖于输入对象的类型类型 。华东理工大学自动化系例如例如双斜率输入:双斜率输入:转换完成且值发生变化时,该事件发生转换完成且值发生变化时,该事件发生 定期及周期输入:定期及周期输入:事件发生在定时度量结束时事件发生在定时度量结束时脉冲计数输入:脉冲计数输入:每每0.8390.839秒事件发生一次,即当一个秒事件发生一次,即当一个新的脉冲计数值有效时。新的脉冲计数值有效时。华东理工大学自动化系3)input_value变量变量
34、 long int类型类型,内嵌变量,可象任何其他的,内嵌变量,可象任何其他的C变量一样使用变量一样使用. .例例: :when(io_changes(io_switch_in) nv_switch_state= (input_value= = SWITCH_ON)? ST_ON:ST_OFF ; 例中可以根据例中可以根据 input_value的值设置网络的值设置网络变量变量nv_switch_state的值。的值。 input_value 只有在只有在io_changes和和io_update_occurs事件发生后才有效。事件发生后才有效。有两种方法可以帮助你确定输入值是否为新值。有两种
35、方法可以帮助你确定输入值是否为新值。华东理工大学自动化系3 3 节点间通信节点间通信3.1 3.1 网络变量网络变量概述概述(1 1)可定义为输入或输出)可定义为输入或输出(2 2)基于)基于NeuronNeuron节点定义节点定义6262个,基于非个,基于非NeuronNeuron节点可节点可定义定义40964096个个(3 3)实现节点间通信、数据共享)实现节点间通信、数据共享(4 4)由)由LonTalkLonTalk协议实现,被称为隐式消息协议实现,被称为隐式消息(5 5)类型相同的网络变量才能建立)类型相同的网络变量才能建立I/OI/O连接连接(6 6)不用考虑消息的打包、发送及接收
36、,简化编程,)不用考虑消息的打包、发送及接收,简化编程,缩短开发周期。缩短开发周期。华东理工大学自动化系3.1.1 3.1.1 网络变量的说明网络变量的说明network input | output type identifier = initial-value;network input | output type identifier array-bound = initializer-list华东理工大学自动化系 input、output :输出输出/ /输入网络变量输入网络变量 identifier:identifier:用户定义的网络变量名用户定义的网络变量名 初值:(初值:(in
37、itial-value)指定一个初值指定一个初值说明华东理工大学自动化系Type: 网络变量的数据类型 (1 1)signedlong int signedlong int (2 2) unsigned long intunsigned long int (3 3)signedshort int signedshort int (4 4) unsigned short intunsigned short int (5 5)signed char signed char (6 6) unsinged char unsinged char (7 7)枚举)枚举 (9 9)标准网络变量()标准网络变
38、量(SNVTSNVT) (8 8)以上类型构成的结构体、数组(最多)以上类型构成的结构体、数组(最多6262个元素)个元素)SNVT: SNVT: 是一组与是一组与数据的单位数据的单位(如摄氏、伏、米等)相关联的(如摄氏、伏、米等)相关联的预定义网络变量预定义网络变量类型,同时类型,同时SNVT SNVT 还定义了网络变量值的范还定义了网络变量值的范围以及类型标识号围以及类型标识号IDID。目前。目前, ,已定义了的标准网络变量有已定义了的标准网络变量有255255种。种。华东理工大学自动化系例例network input SNVT_temp temp_set_point; network o
39、utput SNVT_lev_disc primary_heater; network output int current_temp; network output boolean bind_info(priority) fire_aalarm; network output boolean bind_info priority(nonconfig) fire_aalarm; 华东理工大学自动化系3.1.2 网络变量的连接 网络变量的连接是独立于节点上的网络变量的连接是独立于节点上的Neuron C 应应用的。网络变量的连接由网络管理工具中称为连用的。网络变量的连接由网络管理工具中称为连接器
40、接器(Binder)的部分来建立。的部分来建立。Binder是是LonBuilder网络管理程序、网络管理程序、LonMaker安装工具安装工具或其它网络管理工具的一部分。或其它网络管理工具的一部分。 连接器首先找共享共同网络变量的所有节点。然连接器首先找共享共同网络变量的所有节点。然后对每个网络变量,连接器给所有相应的节点分配后对每个网络变量,连接器给所有相应的节点分配地址,以保证信息从正确的地方来,到正确的地方地址,以保证信息从正确的地方来,到正确的地方去。去。 is_bound( )函数用来确定网络变量是否连接到函数用来确定网络变量是否连接到其它任何的网络变量其它任何的网络变量 。华东理
41、工大学自动化系3.1.3 网络变量事件 有有4个和网络变量相关的预定义的事件:个和网络变量相关的预定义的事件: nv_update_completes (network-var) nv_update_fails (network-var) nv_update_occurs (network-var) 只用于只用于输入输入网络变量网络变量 nv_update_succeeds (network-var) 其它三个事件其它三个事件, ,当输出网络变量被更新时,用于输出网络变当输出网络变量被更新时,用于输出网络变量,当输入网络变量被轮循时,应用于输入网络变量量,当输入网络变量被轮循时,应用于输入网络
42、变量 。network-var :可用网络变量名、网络变量数组名或网络变可用网络变量名、网络变量数组名或网络变量数组元素来限定量数组元素来限定例如例如: network_varindex,如事件被一个数组名限定如事件被一个数组名限定, ,事件将事件将对每个数组元素发生一次对每个数组元素发生一次 。华东理工大学自动化系 nv_update_occurs (network-var)事件事件network-var:如果省略,事件对任何网络变量更新都为:如果省略,事件对任何网络变量更新都为真。当真。当输入网络输入网络变量收到一个新值,变量收到一个新值,nv_update_occurs事事件为真。件为真
43、。例例 network input SNVT_temp tempSetPoint;network input SNVT_temp tempSetPoint; when(nv_update_occurs(tempSetPoint) when(nv_update_occurs(tempSetPoint) primaryHeader= primaryHeader= (curTemptempSetPoint)?ST_ON:ST_OFF; (curTemptempSetPoint)?ST_ON:ST_OFF; 华东理工大学自动化系 nv_update_completes (network-var)事件事
44、件 network-var:可是网络变量名、网络变量数组名或网络变量数:可是网络变量名、网络变量数组名或网络变量数组元素,也可没有。组元素,也可没有。用于:用于:(1)输出网络变量更新完成)输出网络变量更新完成(2)被轮循的输入网络变量操作完成)被轮循的输入网络变量操作完成 无论成功还是失败,只要完成该事件都判断为真。无论成功还是失败,只要完成该事件都判断为真。例:例:network output int humidity; humidity=32; when(nv_update_completes(humidity) 华东理工大学自动化系 nv_update_fails和和nv_update
45、_succeeds nv_update_fails(network-var) 当一个网络变量更新或轮循失败后,当一个网络变量更新或轮循失败后,nv_update_fails事事件为真。如果没有为该事件指定相应的网络变量,那么件为真。如果没有为该事件指定相应的网络变量,那么该节点上任何网络变量的更新或轮循失败该事件都检测该节点上任何网络变量的更新或轮循失败该事件都检测为真。如果多个网络变量被指定,则每一个网络变量更为真。如果多个网络变量被指定,则每一个网络变量更新或轮循失败都使该事件为真。新或轮循失败都使该事件为真。nv_update_succeeds(network-var) 同样当输出网络变
46、量更新已被成功地发送或来自所有写同样当输出网络变量更新已被成功地发送或来自所有写出节点的轮循都已被接收到,出节点的轮循都已被接收到,nv_update_succeeds事件事件为真。为真。华东理工大学自动化系三个节点网络示意图三个节点网络示意图开关节点nv_switch_statenv_lamp_state电灯节点电灯节点nv_lamp_state一个输出网络变量控制两个输入网络变量华东理工大学自动化系开关节点开关节点#pragma enable_io_pullups;#include network output SNVT_lev_disc nv_switch_state=ST_OFF;#d
47、efine BUTTON_DOWN 1#define BUTTON_UP 0IO_4 input bit ioButton=BUTTON_UP; / I/O任务任务When(io_changes(ioButton)to BUTTON_DOWN)nv_switch_state=(nv_switch_state!=ST_OFF)? ST_OFF:ST_ON;华东理工大学自动化系电灯节点电灯节点network input SNVT_lev_disc nv_lamp_state=ST_OFF;#define LED_ON 1#define LED_OFF 0IO_0 output bit ioLED=
48、LED_OFF;/修改任务修改任务-修改电灯的状态,用网络变量的值作为电灯的新状态修改电灯的状态,用网络变量的值作为电灯的新状态when(nv_update_occurs(nv_lamp_state)io_out(ioLED,(nv_lamp_state!=ST_OFF)?LED_ON:LED_OFF);华东理工大学自动化系3.2 3.2 显式报文显式报文 3.2.1 3.2.1 显式报文与网络变量的比较显式报文与网络变量的比较(1)(1)显式报文有一个可变大小的数据域,一个给定的网络变量显式报文有一个可变大小的数据域,一个给定的网络变量数据域的大小是一个常数。数据域的大小是一个常数。(2)(
49、2)显式报文提供了请求显式报文提供了请求/ /响应机制,使得在一个节点上的应用响应机制,使得在一个节点上的应用可以引起另一个节点的应用来响应它可以引起另一个节点的应用来响应它. .(3)(3)显式报文使用的显式报文使用的E E2 2PROMPROM表空间比网络变量少,用的代码空表空间比网络变量少,用的代码空间比网络变量要多间比网络变量要多 . .(4)(4)显式报文是从一个节点向另一个节点传送信息的更复杂的显式报文是从一个节点向另一个节点传送信息的更复杂的方法。程序员必须显示地构造、发送和接收显示报文。而报文方法。程序员必须显示地构造、发送和接收显示报文。而报文的属性例如服务类型、认证和优先级
50、是在编译时定义的,在节的属性例如服务类型、认证和优先级是在编译时定义的,在节点安装后是不能通过网络管理工具配置的。点安装后是不能通过网络管理工具配置的。 华东理工大学自动化系3.2.2 3.2.2 显显式式报文报文 操作步骤操作步骤 Neuron C 功能功能(1) 构造一个报文构造一个报文 msg_out对象对象(2) 发送一个报文发送一个报文 msg_send() 函数函数 msg_cancel() 函数函数(3) 接收一个报文接收一个报文 msg_arrives 事件事件 msg_receive函数函数 msg_in 对象对象(4) 发送报文后的确认服务发送报文后的确认服务 msg_co