《第4讲NEURON C 编程及技巧》由会员分享,可在线阅读,更多相关《第4讲NEURON C 编程及技巧(89页珍藏版)》请在金锄头文库上搜索。
1、华东理工大学自动化系现场总线控制系统第3讲Neuron C 语言与I/O对象 信息学院自动化系 凌志浩内容简介1 Neuron C 简介 2 Neuron C 编程及技巧 3 节点间通信 3.1 网络变量 3.2 显示报文 4 输入输出对象华东理工大学自动化系 1 Neuron C 简介 Neuron芯片的应用程序是用Neuron C编写的 。Neuron C是建立在ANSI C的基础上的,与之相比有 如下三方面扩展功能: (1)一种新的语句类型when,引入事件并定义任务事件 的执行顺序。 (2)新增加了37种数据类型,34种输入/输出对象,2个 定时器/计数器对象,大大简化了设备控制器的用
2、法。 (3)网络变量的内部消息传送机制和其他消息处理机制 。它是将程序样例建立在事件上的。也即应用程序是被 发生在网络当中或指定设备上的事件所触发的。因此网 络自己是被事件驱动的。 华东理工大学自动化系1.1 对ANSI C 的扩展包括(1)一个内部多任务调度程序,它允许程序员以自然的方式描 述事件驱动的任务,同时控制这些任务的优先级的执行。 (2)将I/O对象直接映射到处理器的I/O能力。 (3)网络变量对象定义:提供一种简单的实现节点之间数据共 享的方法。 (4)when语句:引入事件并定义这些事件所对应的任务。 (5)显式消息传递( explicit message ):用于直接对Lon
3、Talk 协议的底层进行访问。 (6)秒及毫秒级软件定时器对象。 (7)函数库:当调用时,可以执行事件检查、管理输入/输出、 网上发送或接收消息以及控制Neuron芯片的各种功能。 (8)Neuron C中有三个ANSI包含文件:、。华东理工大学自动化系1.2 Neuron C 支持的变量的类型(1) 整型(整型常数或整型变量)int 、short int、long int、unsinged int 、 signed(可省略) int (2)字符型(字符型常数或字符型变量)unsigned char(8位)、 signed char (8位) (3) typedef enum FALSE、TR
4、UE boolean (4)其他 华东理工大学自动化系1.3 Neuron C 变量定义(1)Neuron C和ANSI 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 结构和共用体 structchar name10;int age;char addr10; 华东理工大学自动化系(2)Neuron C中附加定义的对象I/O对象: IO_0 output b
5、it alarm 定时器: mtimer led_on_timer 网络变量:network input int net_is_car 消息标签:msg_tag command 华东理工大学自动化系1.4 编译指令 NEURON C允许通过#pragma编译指令进行编 译器扩充。#pragma可用来设置一个Neuron 芯 片的系统资源以及节点参数,诸如缓存器数及其 大小,接收事务数等。也可用于对特定的 Neuron芯片参数进行控制,这些指令可在源文 件的任何位置出现。 例:#pragma enable_io_pull_ups 可使IO4-IO7的上拉使能华东理工大学自动化系 2 Neuron
6、 C 编程及技巧 2.1 调度程序 Neuron 芯片的任务调度是由事件驱动的 :当一个给定的条件判断为“真”时,与该事 件有关的代码被执行(称为任务被执行)。调度 程序允许定义任务,该任务作为特定事件的结 果而被运行,如:输入管脚的改变、接收一个 网络变量的新值、或定时器溢出等。也可以指 定某些任务是具有优先级的任务,以便能得到 优先服务。华东理工大学自动化系(1) when语句事件由when语句来定义,when语句包含一个表 达式,当表达式为真时,表达式后面的代码段被执 行。例:when(timer_expires(led_timer) /当定时器溢出时执行下列任务io_out(io_le
7、d,OFF);在任务执行后,时间溢出事件被清除。当 led_timer再次溢出,when子句判断为真,任务又将 执行;否则,任务被忽略。华东理工大学自动化系A. 多个when子句可与一个任务发生关联when(reset) when(io_change(io_switch) when(!timer_expires) when(x= =3) . 华东理工大学自动化系B. when子句不能嵌套如下为错误:when(io_changes(io_switch)when(x= =3)华东理工大学自动化系()when子句语法priority prompt_safe when(event) task prio
8、rity(优先级) :可选择项 prompt_safe:可选项,如使用即便应用程序处于占先模 式,仍然允许调度程序执行相关的when任务 。 event:可是预定的事件也可是有效的 Neuron C 表达式 。 task:是Neuron 的复合语句,任务同void函数体等同 ,也即它不能返回一个值.华东理工大学自动化系()when语句中的事件类型分为两种:预定义事件和用户定义事件 预定义事件:使用编译器内部固有的关键字,包括输入引脚 状态变化、网络变量修改、定时器溢出以及消息的接收等 。 用户定义事件:可以是任何有效的Neuron C表达式。例: when(msg_arrives) /正确wh
9、en(online) /正确 when(msg_arrives when(io_changes(push_button) to 0) IO_7 input pulsecount total_ticks; when(io_changes(total_ticks) by 100) 例华东理工大学自动化系对于定时器/计数器对象,io_changes事件发生于 :双斜率输入:转换完成时事件发生 定期及周期输入:如果测量时间与上次测量时间 相比已发生改变时事件发生。 脉冲计数输入:如果脉冲计数的值与上次计数相 比已发生改变,则事件发生。华东理工大学自动化系2) io_update_occurs事件 语法
10、: io_update_occurs (io-object- name) 当输入对象(io-object-name)读取的值发 生改变时,io_update_occurs事件为真。 该事件只能用在某些定时器/计数器的输 入对象中。对事件的定时依赖于输入对 象的类型 。华东理工大学自动化系 例如双斜率输入:转换完成且值发生变化时,该事件发 生定期及周期输入:事件发生在定时度量结束时脉冲计数输入:每0.839秒事件发生一次,即当一个 新的脉冲计数值有效时。华东理工大学自动化系3)input_value变量 long int类型,内嵌变量,可象任何其他的C变量一样使 用. 例: when(io_ch
11、anges(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事件发生后才有效 。 有两种方法可以帮助你确定输入值是否为新值。华东理工大学自动化系3 节点间通信3.1 网络变量 概述 (1)可定义为输入或输出 (2)基于Neuron节点定义62个,基于非Neuron节点 可定义4096个 (3)实现节点间通信、数据共享 (4
12、)由LonTalk协议实现,被称为隐式消息 (5)类型相同的网络变量才能建立I/O连接 (6)不用考虑消息的打包、发送及接收,简化编程 ,缩短开发周期。华东理工大学自动化系3.1.1 网络变量的说明network input | output type identifier = initial-value;network input | output type identifier array- bound = initializer-list华东理工大学自动化系input、output :输出/输入网络变量 identifier:用户定义的网络变量名初值:(initial-value)指定一
13、个初值说明华东理工大学自动化系Type: 网络变量的数据类型(1)signedlong int (2) unsigned long int(3)signedshort int (4) unsigned short int(5)signed char (6) unsinged char (7)枚举 (9)标准网络变量(SNVT)(8)以上类型构成的结构体、数组(最多62个元素)SNVT: 是一组与数据的单位(如摄氏、伏、米等)相关联的 预定义网络变量类型,同时SNVT 还定义了网络变量值的 范围以及类型标识号ID。目前,已定义了的标准网络变量 有255种。华东理工大学自动化系 例network
14、input SNVT_temp temp_set_point; network output 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 应用的。网络变量的连接由网络管理工具中称为
15、连 接器(Binder)的部分来建立。Binder是 LonBuilder网络管理程序、LonMaker安装工具 或其它网络管理工具的一部分。连接器首先找共享共同网络变量的所有节点。然后对每个网络变量,连接器给所有相应的节点分配 地址,以保证信息从正确的地方来,到正确的地方 去。 is_bound( )函数用来确定网络变量是否连接到 其它任何的网络变量 。华东理工大学自动化系 3.1.3 网络变量事件 有4个和网络变量相关的预定义的事件:nv_update_completes (network-var)nv_update_fails (network-var)nv_update_occurs (network-var) 只用于输入网络变量nv_update_succeeds (network-var) 其它三个事件,当输出网络变量被更新时,用于输出网络 变量,当输入网络变量轮循时,应用于输入网络变量 。 network-var :可用网络变量名、网络变量数组名或网络变 量数组元素来限定 例如: network_varindex,如事件被一个数组名限定,事件 将对每个数组元素发生一次 。华东理工大学