使用宏指令执行串口通讯
51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。
本文将介绍使用C语言编写51单片机的串口通信程序。
1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。
首先,我们需要一块51单片机开发板,内置了串口通信功能。
另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。
2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。
在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。
同时,我们还需要引入头文件来定义串口通信的相关寄存器。
3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。
这些参数的配置需要根据实际需要进行调整。
在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。
4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。
初始化串口的过程包括打开串口、设置中断等。
5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。
阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。
6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。
在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。
7. 中断处理在串口通信中,中断是一种常见的处理方式。
通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。
8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。
```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。
数控机床编程中的宏指令使用技巧

数控机床编程中的宏指令使用技巧在数控机床编程中,宏指令是一种非常有用的工具。
宏指令可以帮助程序员简化复杂的编程过程,提高编程效率,并实现一些常用的功能。
下面将介绍数控机床编程中宏指令的使用技巧,以便程序员们能够更好地利用这一工具。
首先,宏指令的定义是非常重要的。
在使用宏指令之前,程序员需要清楚地定义宏指令的名称和参数。
宏指令的名称应当具有一定的描述性,能够表达出宏指令所实现的功能。
参数则是用于接收外部传入的数值或变量,在宏指令内部可以使用这些参数进行计算或操作。
其次,正确使用宏指令的关键是合理设置参数。
程序员需要根据具体的编程需求,选择合适的参数类型和参数个数。
参数类型可以包括整型、浮点型、字符串等,根据实际情况进行选择。
参数个数则取决于宏指令的功能和复杂程度,需要确保参数个数既能满足功能需求,又不过多导致编程复杂化。
另外,程序员在使用宏指令时需要注意宏指令的作用域。
宏指令可以设置为全局范围或局部范围。
全局范围表示宏指令可以在整个编程过程中使用,而局部范围表示宏指令仅在指定的程序段内有效。
根据实际需求,程序员需要选择合适的作用域,避免出现命名冲突或误用的情况。
此外,程序员在使用宏指令时还应考虑宏指令的可读性和重用性。
为了提高程序的可读性,宏指令的命名应当具有一定的规范性,易于理解和记忆。
此外,程序员可以使用注释来说明宏指令的具体功能和使用方法,方便他人理解和修改。
而为了提高宏指令的重用性,程序员可以将常用的功能模块封装为宏指令,以便在其他程序中复用,提高编程效率。
最后,程序员在使用宏指令时要考虑其安全性和稳定性。
宏指令中的代码应当经过严格的测试和验证,确保没有错误或潜在的问题。
此外,程序员应当尽量避免使用复杂的宏指令,以免导致程序崩溃或出现错误。
如果遇到问题,应及时调试和修改宏指令,确保程序的稳定运行。
总之,数控机床编程中的宏指令使用技巧对于提高编程效率和简化编程过程非常重要。
程序员们应当清楚地定义宏指令的名称和参数,并合理设置其作用域和参数。
触摸屏与单片机的通讯实现

触摸屏与单片机的通讯实现摘要:在当前的嵌入式设备中,触摸屏作为人机接口得到了广泛的应用。
文章讨论了基于HIT6600触摸屏模块与富士通16位单片机90F340串口通讯实现的软硬件设计。
关键词:HIT6600 90F340 触摸屏单片机1、引言随着后PC 时代的到来,嵌入式系统在信息家电、移动计算设备、网络设备、工业控制和仪器仪表等众多领域中得到了广泛的应用,在这些产品中,触摸屏因方便灵活、节省空间、直观等特点,已经逐渐取代键盘成为嵌入式计算机系统主流的输入设备。
触摸屏输入系统由触摸屏、触摸屏控制器、微控制器及其相应的驱动程序构成。
本文介绍触摸屏控制器与富士通16位单片机90f340串口通讯实现的软硬件设计。
2、触摸屏与单片机的硬件连接采用HIT6600触摸屏与90F340单片机一对多通信。
把触摸屏的COM1 9孔插座与串口通讯的90F340单片机相连接。
注意:通信电缆DB9是1-485的正极、6 -485的负极。
由于是一对多的通讯,所以增加串口通讯芯片MAX1487满足分机负载要求。
3、建立触摸屏与单片机通讯的软件设置打开触摸屏组态软件,从[应用]下拉菜单中选[设定工作参数],弹出如图1所示工作参数设置对话框。
触摸屏的系统参数中装置名称设置成ModBus Master,通信参数设置必需与单片机通信参数设置一致。
通信口/连线方式设置成COM1,数据位设置成8位,1个停止位,波特率9600,校验位设置与单片机编程一致,PLC站号是单片机定义的站地址一样,站号需从1开始。
参数设置完成,按确定键。
4、触摸屏的主态软件通讯设置编辑HIT6600触摸屏提供了一种既方便又功能强大的宏指令应用方式,使人机得以经由内部宏指令(Macro Function)功能执行数值运算,逻辑判断,流程控制,数值传递,数值转换,计时器计数器,自定通讯指令操作等等,由宏指令的使用可让人机不仅和PLC 连线通讯,同时由另一通讯口来执行同其他通讯设备连线,此功能不仅提供有效的系统整合同时成为最经济便宜的硬件应用架构。
协议宏串行通信

规格
RS232+RS422/485 RS232+总线接口 RS232x2 RS422/485+RS232 RS232x2 RS232+RS422/485 RS232x2 RS232+RS422/485 RS232x2
数量
1 1 1 1 16 16 1 1 16
CQM1H-CPU51/61 才能安装
CJ1 CS1
协议宏几个定义
通信序列:对于外场串行设备的 通信过程。可创建1000个序列。 步:在一个通信序列下,对外场 设备的发送/接收。一个通信序列 可创建16步。 报文:发送或接收的报文格式 (帧格式)。
通信序列的参数(一)
传输控制:
•RTS/CTS流控制:硬件 •XON/XOFF流控制:软件11hex/13hex •Contention 控制:在点对点Contention控制中 获得正确发送 •Delimiter控制:通过分隔符把数据分成若干 帧。 •Modem控制:DTR信号的控制 链接字: •在PLC和通信板/单元之间共享的字设定 •I1/O1、I2/O2。IN:接收数据存储;OUT:发送 数据存储
协议宏串行通信
一 、 串行通信基础知识
(一)基本概念
1.并行传输&串行传输
B
0 1
A
B
A
┋ 0 1
主要适用于长距离、低速 率的通信中
2.单工、半双工、全双工(i)
数据流向
单工
发送装置
接受装置
半双工
发送装置
数据流向1
接受装置
接受装置
数据流向2
发送装置
2.单工、半双工、全双工(ii)
数据流向1
发送装置 接受装置
自由口通讯

本章主要讲述在 SKWorkshop(以下简称 SK)组态软件中如何用宏指令编写 自由通讯协议。SK 的自由通讯协议编写主要运用了内部自带的两个函数:
PUTCHARS(发送数据函数)和 GETCHARS(接收数据函数)。编程人员运用这两个函数 可以很方便的编写自己的设备协议。
首先新建一个工程,命名为:自由口通讯;通讯连接设置连接接口:COM1;设备服务 选择:Samkoon NULL PLC(或者建立工程后在连接中更改),如图 3-1:
}
else
//接收正确
{
LW2=Gdata[0]&0xff;
//数据处理
LB0=0;//处理Fra bibliotek毕,下次进入时发送
PUTCHARS(0,Pdata,0);
//清除缓冲区
}
}
在变量设定表里面建立如下 4 个变量:
LB0:内部地址 LB0,BOOL,读写;
LW0:内部地址 LW0,16 位整数,写;
LW1:内部地址 LW1,16 位整数,写;
//所要发送的数据
Pdata[1]=0x02;
Pdata[2]=0x03;
Pdata[3]=0x04;
PUTCHARS(0,Pdata,4);
//发送函数,发送数据到串口
LB0=1;
//发送完毕,下次进入不发送,等待接收
return;
//退出等待接收
}
else
{
result=GETCHARS(0,Gdata); //接收函数,把接收到的数据存在 Gdata 数组中
图 3-2
图 3-3 下载工程至触摸屏,用串口线连接电脑与触摸屏。电脑端打开串口调试助手, 设置串口参数与触摸屏参数一致。连接成功以后在接收区接收到如图 3-4 所示代 码
宏指令使用手册

EasyBuilder 500 Macro使用说明一:文档说明作者 : 程志刚时间 : 2003年1月版权所有 : 台湾威纶科技有限公司概要 : 此文档为宏指令功能模块的使用文档,说明宏语言的语法,宏语言的使用,宏指令源程序编写的操作方法与操作顺序,使用文档包含以下几个部分:宏语言文本说明:宏语言使用说明宏指令程序与PLC的通信(包括本地地址LocalBit,LocalWord):宏指令操作说明有关宏指令使用的若干说明编译错误提示程序示例源程序二:宏语言文本说明:1: 常数与变量a:常量(1)十进制常量(2)十六进常数(3)单引号内的ASCII常量(字符常量)(4) 逻辑常量:True (非零),False(零)b:变量(a)变量命名必须以字每开头,其它字符可以是字每或数字,不得超过32个字符的长度(b) 数据类型(char) 字符类型(int) 整数类型 32-bit(short) 短整数类型 16-bit(float) 浮点数类型(bool ) 逻辑类型2: 运算符(1)赋值运算赋值运算: =(2)算术运算:加:+减:-乘:*除:/余:mod ,(3)关系运算:小于:<小于等于:<=大于:>大于等于: >=等于: ==不等于: <>(4)逻辑运算:逻辑于:And逻辑或:Or逻辑Xor逻辑非:Not(5)位运算:(a)移位运算左移: <<右移: >>(b)逻辑位运算位与运算: &位或运算: |位异或运算: ^位取反运算: ~3: 运算符的优先级:表达式中执行多个操作时,每一部分都按规定的顺序计算,这种运算符间的计算次序,叫运算符的优先级(1)同一种类运算符的优先顺序(按左到右,依次从高到低)算术运算符 : ^ Æ( * , / ) Æ ( mod ) Æ ( + , - )移位运算: 其出现的优先顺序,按在表达式中出现的次序从左到右进行处理关系运算符 : 其出现的优先顺序,按在表达式中出现的次序从左到右进行处理逻辑运算符 : Not Æ And Æ Or Æ Xor,(2)算术运算优先于位运算位运算优先于关系运算逻辑运算优先于赋值运算4: 数组(1)数组 :只支持静态一维数组,形式为:一维数组 : 数组名[数组的大小]数组的下标为整数其可取值区间为0 --- 4294967295下标最小值:零下标最小值:数组的大小 – 1如 : Array[MAX] MAX =100下标最小值 :0下标最小值:99 ( 100 – 1)5: 表达式(a) 运算对象(1)常量(2)变量(3)数组元素(4)函数调用(b) 表达式组成表达式由运算对象和运算符按一定规则组合而成6: 语句(1):说明语句(a) type name说明name的类型(b) type name[constant] 说明name类型的一维数组(2): 赋值语句形式为:变量 =表达式(3) 逻辑判断与分支(a) 单行形式If Condition Then [ Statements ] [ Else elseStatements ]End If(b) 块形式If Condition Then[ Statements ][ Else [If Condition – n Then[elseifstatements ] ….[ Else[ elsestatements ] ]] ]End If语法说明 :Condition 必要,为一条件表达式,条件表达式值为零,则视为假 FALSE,条件表达式值为非零,则视为真TRUEStatements 在块形式中是选参数,在单行形式中,且没有Else子句时,为必要参数,该语句在Condition为真是时执行Condition-n 可选,解释同Conditionelseifstatements 可选,一条或多条语句,在相对应的Condition – n为TRUE时执行Elsestatements 可选,在上述Condition和Condition—n都不为TRUE时执行(C) 多重分支选择 Select Case 语句Select Case TestExpression[Case expression –n[starements-n] ]……[Case Else[elsestatements ] ]End Select语法说明:TestExpression 必要,任何数值或字符串表达式Expression—n 如果有Case出现则为必要参数,为字符串或整形数值常量Statements—n 可选,为一条或多条语句,当TestExpression和对应的expression—n相等时,则执行Elsestatements 可选 , 为一条或多条语句,当TestExpression不和任一expression—n相等时,则执行(4)循环控制a)For –Next语句:常用于次数已确定的情况,当为To时,此时按步长递增,当为Down时,此时按步长递减For counter = start To(Down) end [Step step ][Statements ]Next [counter ]语法说明:Counter 必要,循环计数器的数值变量,该变量只能是整形或字符形变量Start 必要,Counter的初值End 必要,Counter的终值Step 可选 ,Counter的步长,如果没有指定,则缺省为1,只能是数值Statements 可选 ,For和Next之间的语句块,该语句块将执行指定的次数b)While – Wend语句由条件控制的循环,条件放置于循环顶部逻辑表达式值为TRUE或FALSE,当指定的条件为TRUE时,执行循环体中的语句块While condition[statements]Wend语法说明Condition 必要,逻辑表达式,其计算结果为TRUE或FALSE,condition为TRUE时执行循环体Statements 可选,为一语句块,当condition的值为TRUE时(5)break ;用于循环和条件选择语句中,执行到此语句时,退出循环或条件语句(6)continue用于循环,执行到此语句时,中断这一次循环的执行,到下一次循环执行(7)return函数返回语句7: 关键字集:宏语言规定的,用作特定的用途,不能作为函数名,数组名,变量名等的记号+ , - ,* , / ,^, mod, >= ,>, < ,<=, <> ,== ,And,Or,Xor,Not,<<,>>,= ,& ,|,^,~If ,Then,Else,EndIf,Select ,Case ,For, To, Down Step, Next, while, wend break ,continue,return三:宏语言使用说明1: 局部变量及全局变量(1:)局部变量: 在一个函数范围内有效,(2:)全局变量: 从定义或声明的地方开始到宏指令程序结束有效在一个函数内当有相同名称的全局变量与局部变量时,是局部变量有效2: 变量赋初值及常量(1:)变量赋初值(a)在声明语句中直接进行赋值值e.g: int h = 9(b) 在声明或定义后,用赋值语句进行变量的赋初值(2:)数组变量的赋初值形式如: int g[10] = { 1,2,3, , 3 }初值用花括号括起来, 各数组分量用分号隔开,从左到右赋按数组下标从零开始的顺序赋给各数组分量,(3:)常量 :宏语言支持:十进制整形常量十六进制整形常量以0x开头字符形常量,逻辑常量 : True 代表真, False代表假 ,3: 逻辑变量及表达式(1:)逻辑变量:它有真(True),假(False)两种取值的情况,所有非零的值认为是真(True),零值认为是假(False)(2:)表达式:条件表达式的值为零值即为假,代表条件不成立,条件表达式的值为非零值即为真,代表条件成立4: 声明语句(1:)声明语句在函数外声明或定义全局变量,(2:)声明语句在函数内声明或定义局部变量,同时局部变量声明语句在函数内的最前面,其间不能有其它的语句,否则会给出编译错的提示For example :Macro_Command main( )char i ,i = 9//在声明语句间的非声明语句,将给出编译错的提示int g[10]For g[2] = 0To2g[3] = 4Next g[2]End Macro_Command5: 函数调用及参数传递方式(1:)函数调用:被调用的函数须在调用函数的前面定义,否则将给出函数没有定义的编译错提示For example :Macro_Command main( )int i ,i = Func( i ) //将给出函数Func没有定义的编译错误提示End Macro_CommandSub int Func( int i )int h = 9i = 9 * hReturn iEnd Sub(2:)参数传递方式:(a)通过局部变量传值的方式传递参数(b)通过函数间共享全局变量的方式传递参数6: 主函数宏指令源程序有且只能有一个主函数, 它是宏指令程序开始执行的入口,其形式为: Macro_Command 函数名( )End Macro_Command四: 宏指令程序与PLC的通信(包括本地地址LocalBit,LocalWord):功能: 使用库函数实现与Plc的沟通在宏指令程序的计算与控制中当Plc地址类型的变量参与时,就通过库函数GetData( … )从EasyView連接的Plc中取数据,通过库函数SetData( … )把结果数据送到EasyView連接的Plc 中,这样就把处理plc信息的繁杂工作交给了GetData( … )与SetData( … )等库函数1: GetData(各种支持的数据类型 DestData, CString strAddr_Type, int iAddr_Off, int iDataCount )说明:实现从Plc中取数据,通过对话框填表的形式输入参数说明:DestData 得数据的首址CString strAddr_Type Plc地址类型和编码方式int iAddr_Off Plc地址偏移int iDataCount 数据项数返回值: 没有2: SetData(各种支持的数据类型DestData ,CString strAddr_Type , int iAddr_Off , int iDataCount )参数说明:DestData 送出去数据的首址CString strAddr_Type Plc地址类型和编码方式int iAddr_Off Plc地址偏移int iDataCount 数据项数返回值: 没有五:宏指令操作说明1: 宏指令程序的编写分三步进行,第一步:在EB500主界面中启动宏指令功能模块的第一个对话框(MacroControlDlg)第二步:在MacroControlDlg对话框中进行宏指令间的拷贝,删除,编辑,调用MacroWorkSpaceDlg对话框进行宏指令源程序的编辑,第三步:宏指令源程序的编辑,确定一条宏指令的名称,编号,编译,及排除编译错误2: 宏指令源程序通信函数的编辑方法(1:)输入:(第一步:) 在宏指令源程序要输入库函数的地方,输入关键字:”Insert”{ 或者把光标置于要输入库函数的地方,后呼叫PlcCom按钮,}(第二步:) 在库函数编辑对话框,进行库函数的选择和库函数参数的设置,按Ok按钮完成此次库函数的输入,按Cancel按钮取消此次输入操作(2:)修改:将光标置于要修改的库函数上对其进行修改,按(1:)的第一步,第二步操作即可(3:)删除:把要删除的库函数选定,在键盘上按Delete键即可将其删除3:宏指令触发条件的确定.见图”Trigger(Macro).bmp” (第一步:) 在PlcControl物件属性对话框中选择控制类型为Execute MacroProgram,(第二步:) 在PlcControl物件属性对话框中选择一个MacroID并确定一个触发位六:有关宏指令使用的若干说明(1:)宏指令程序存储空间的限制一个eob档中所有宏指令存储空间受公共窗口0空间大小的限制,同时一个宏指令程序中的局部变量存储空间最大为4k,(2:)最多可能执行的宏指令条数的限制一个eob档中最多可以使用256条宏指令程序.(3:)宏指令可能出现的死机情况宏指令程序中有死循环,且死循环中没有通信时.宏指令程序中数组数据使用,存储空间越界时.(4:)宏指令程序通信时的速度.宏指令程序在有通信时,它的执行可能会有点慢.这是由于通信占用太多的时间所造成的.七:编译错误提示1:错误提示形式:宏指令名称(: 编译错误编号 ) 错误提示当编译没有通过时,可以通过编译错误编号,查找对错误的说明2:错误描述:(1: ) "语法错:" “'identifier'很多种情况会给出这条编译错误的提示,For example :Macro_Command main( )char i ,程 //这是一个不支持的记号 ,”错误提示为: “语法错: 程”int g[i] //定义错For g[2] = 0To2g[3] = 4Next g[2]End Macro_Command出现这条错误提示时,一般都是多了,或少了一个符号,很容易改正错误(2:) 'identifier' :" 数组没有被指定大小" ;只支持静态数组,定义数组变量时,必须指定数组的大小For example :Macro_Command main( )char iint g[i]//定义错For g[2] = 0To2g[3] = 4Next g[2]End Macro_Command(3:) strError = "重定义错: " 'identifier'函数,变量名字在其作用域内必须是唯一的,For example :Macro_Command main( )int g[10] , gFor g[2] = 0To2g[3] = 4Next g[2]End Macro_Command(4:) "函数名错:" 'identifier'关键字,常量等不能用作函数名For example :Macro_Command If( )int g[10] , gFor g[2] = 0To2g[3] = 4Next g[2]End Macro_Command(5:) "括号不配对" ;左括号,右括号不成对出现For example :Macro_Command main ) //少左括号int g[10] , gFor g[2] = 0To2g[3] = 4Next g[2]End Macro_Command(6:) "If后没有表达式" ;(7:) "If语句没有Then" ;(8:) "没有EndIf语句" ;(9:) End If前面没有出现配对的If" ;(10:) "非法的Else语句" ;If语法结构为:If 条件表达式Then[ Else [If 条件表达式Then ] ]EndIf不服合这种表达形式的If选择语句都是不合法的,将给出对应的编译错(11:) "Case后面应为常量" ;(12:)"Select后少Case关键字" ;(13:)"Select Case 后少表达式" ;(14:)"没有End Select语句(15:) 非法的Case语句" ;(16:)"End Select前面没有出现配对的Select" ;Select Case语法结构为:Select Case 表达式Case 数值常量Case 数值常量Case 数值常量Case ElseEnd Select不服合这种表达形式的Select Case选择语句都是不合法的,将给出对应的编译错(17:)"For循环不配对,Next前应有For关键字" ;(18:)"此处应为整型或字符型变量" ;(19:) "此处应为赋值号" ;(20:)"此处应为关键字To" ;(21:)"没有 Next 语句" ;For循环语法结构为:For 变量 =初值 To 终值 [Step 步长]Next [变量]不服合这种表达形式的For循环语句都是不合法的,将给出对应的编译错(22:)"While循环不配对,Wend前应有While关键字" ;(23:) 没有 Wend 语句" ;While循环语法结构为:While 条件表达式Wend不服合这种表达形式的While循环语句都是不合法的,将给出对应的编译错(24:) "break语句非法" ;Break语句只能在For循环,While循环 ,Select Case选择结构中使用且Break单独成一语句行(25:)"Continue语句非法" ;Continue语句只能在For循环, While循环中使用且Continue单独成一语句行(26:)"表达式不正确" ;(27:) 运算对象非法" ;在表达式中出现与运算符不匹配的运算对象时,将给出此编译错For example :Macro_Command main( )int g[10] , gFor g[2] = 0To2g[3] = 4 + 程Next g[2]End Macro_Command(28:)"此处应为Sub" ;(29:) "此处应为Macro_Command " ;函数的定义形式为:Sub(Macro_Command) 数据类型函数名( … )End Sub(Macro_Command)不服合这种形式的函数定义,将给出对应的编译错误(30:)"参数个数不对" ;(31:)"实参数据类型不匹配" ;(32:)"实参不对";函数调用时,实参与形参必须在数据类型,参数个数上一一对应才能编译通过否则将给出对应的编译错(33:) "没有定义的函数:" ;(34:)数组分量表达形式非法(35:)数组定义非法";(36)数组下标非法的表示,将给出对应的编译错(37:) "没有定义,或声名的变量" ;只能使用已经定义了的或声名了的变量和函数,否则将给出对应的编译错(38:) "不支持的plc地址类型" ;库函数GetData( … ) , SetData( … )的参数中有plc地址类型信息,当plc地址类型不是此种plc支持的地址类型时,将给出对应的编译错(39:) 应为整型,字符形变量或常量" ;数组的表达形式为:定义时: 数组名[常量] (常量描述数组的大小)使用时: 数组名[整形,字符形变量或常量]不服合这种表达形式(40:) "变量定义或声名语句的前面不能有执行语句"For example :int g[10For g[2g[3] = 4int h , kNext g[2]End(41:) "移位运算中,操作数不能为浮点数"(42:) "函数应返回一个值" ;(43) "函数不应返回一个值"(44:) "运算中不能有Float型数据" ;(45:) "plc地址错" ;(46:) "堆栈不能超过4k" ;(47:)"宏指令程序入口只能有一个" ;(48) "宏指令入口函数不唯一: " 'identifier'宏指令的入口函数只能有一个,形式为:Macro_Command 函数名( )End Macro_Command八:程序示例源程序1: For循环,各种表达式(算术,移位,逻辑,关系表达式) Macro_Command main( )int a[10]int b[10]int ib[0]= (400 + 400 << 2) / 401b[1]= 22 *2 - 30 % 7b[2]= 111 >> 2b[3]= 403 > 9 + 3 >= 9 + 3 < 4 + 3 <= 8 + 8 == 8 b[4]= Not8 + 1And2 + 1Or0 + 1Xor2b[5]= 405And3And Not0b[6]= 8 & 4 + 4 & 4 + 8 | 4 + 8 ^ 4b[7]= 6 - ~ 4b[8]= 0x11b[9]= 409For i = 0To4Step 1If( a[0] == 400 ) ThenGetData(a[0] ,3x_Bin ,0,9)SetData(b[0] ,3x_Bin ,11,10)End IfNextEnd Macro_Command2: while ,if , break , continueMacro_Command main( )int a[10]int b[10]int ib[0]= (400 + 400 << 2) - 401 + 99 b[1]= 100b[2]= 111b[3]= 403b[4]= 404b[5]= 405b[6]= 406b[7]= 407b[8]= 400 % 20 + 21b[9]= 409i = 5While i == 5 - 20 % 3SetData(b[1] ,3x_Bin ,11,1) If b[1] == 100ThenBreakSetData(b[0] ,3x_Bin ,12,1)i = 4ContinueSetData(b[0] ,3x_Bin ,13,1) End IfWendEnd Macro_Command3: 全局变量,函数调用char gSub int sin(int j ,int k)int ySetData(j ,3x_Bin ,14,1)GetData(y ,3x_Bin ,15,1)g = yReturn yEnd SubMacro_Command main( )int a[10]int b[10]int ib[0]= (400 + 400 << 2) - 401 + 99 b[1]= 100b[2]= 111b[3]= 403b[4]= 404b[5]= 405b[6]= 406b[7]= 407b[8]= 400 % 20 + 21b[9]= 409i = 5While i == 5 - 20 % 3SetData(b[1] ,3x_Bin ,11,1)If b[1] == 100ThenSetData(b[0] ,3x_Bin ,12,1)i = sin(b[2],b[3] )SetData(g ,3x_Bin ,17,1) SetData(i ,3x_Bin ,16,1)End IfWendEnd Macro_Command4: 控制自已char iint jSub ClientProgram(int flag)End SubMacro_Command main( )int i[10]int j[2]int wchar xFor w = 0To9i[w] = 0NextGetData(i[0] ,3x_Bin ,1,4)w = i[0] + i[1] + i[2] + i[3]If w > 150ThenFor w = 0To3i[w] = 0NextSetData(i[0] ,3x_Bin ,1,4)x = 0SetData(x ,1x_Bin ,3,1)GetData(i[0] ,3x_Bin ,212,2)x = 0SetData(x ,0x_Bin ,4,1)ElseFor w = 0To3i[w] = i[w] + 2*wNextSetData(i[0] ,3x_Bin ,1,4)End IfEnd Macro_Command5: If结构Macro_Command main( )int K[10]int jFor j = 0To10k[j] = jNextEB500 Macro 使用说明If k[0] == 0ThenSetData(k[4],3x_Bin ,0,1)End IfIf k[0] == 0ThenSetData(k[4],3x_Bin ,0,1)ElseSetData(k[5],3x_Bin ,0,1)End IfIf k[1] == 0ThenSetData(k[3],3x_Bin ,1,1)Else If k[1] == 1ThenSetData(k[1],3x_Bin ,2,1)End IfIf k[1] == 0ThenSetData(20,3x_Bin ,3,1)Else If k[1] == 2ThenSetData(k[1],3x_Bin ,4,1)ElseSetData(k[2],3x_Bin ,5,1)End IfEnd Macro_Command6: Select结构Macro_Command main( )int K[10]int jFor j = 0To10k[j] = jNextSelect Case k[1]Case1j = 1BreakCase2j = 2BreakEnd SelectSetData(j,3x_Bin ,0,1)End Macro_CommandMacro_Command main( )int K[10]int jj = 90 * 1k[4] = 8Select Case k[4]Case1j = 1BreakCase3j = 2EB500 Macro 使用说明End SelectSetData(j,3x_Bin ,0,1)End Macro_Command7: while结构Macro_Command main( )char Toggleflagint a[13]int b[14]int c = 4848char i = 0b[0] = 13While b[0]a[i] = 20 + i * 10If a[i] == 120Thenc =200BreakEnd Ifi = i + 1WendSetData(c ,3x_Bin ,2,1)End Macro_CommandMacro_Command main( )int a[250]int b[250]int i = 1a[0] = 1b[0] = 2While a[0]While b[0]b[i ] = 10 + i * 10If b[i] == 210ThenSetData(i ,3x_Bin ,0,2)b[i] = 200BreakEnd Ifi = i + 1WendIf b[i] == 200ThenSetData(b[0] ,3x_Bin ,0,4)BreakEnd IfSetData(b[0] ,3x_Bin ,0,3)WendEnd Macro_CommandMacro_Command main( )int K[10]int j ,ij = 0EB500 Macro 使用说明i = 0While k[i]k[j] = j + 1j = j + 1If j == 5ThenBreakEnd IfSetData(k[0],3x_Bin ,0,5)End Macro_Command8: Break ,Continue结构(1)Macro_Command main( )int K[10]int jFor j = 0To10If j % 2 == 0Thenk[j] = 5ElseBreakEnd IfNextSetData(k[0],3x_Bin ,0,10)End Macro_Command(2)Macro_Command main( )char Toggleflagint a[13]int b[14]int c = 4848char i = 0b[0] = 13While b[0]a[i] = 20 + i * 10If a[i] == 120Thenc =200i = i + 1ContinueEnd Ifi = i + 1If c == 200ThenSetData(c ,3x_Bin ,2,1)BreakEnd IfWendEnd Macro_Command9: 数组结构Macro_Command main( )int a[25]int b[25]int ib[0] = 13For i = 0To b[0] Step1a[i] = 20 + i * 10NextSetData(a[0] ,3x_Bin ,0,13)End Macro_Command10: 其它int x = 0int yfloat fSub char func1()char Toggleflagint a[14]int b[14]int c = 4848char ib[0] = 13Toggleflag = ( b[0] Xor0x89 + (100 /2) << 2 - 123 >> 2 ) If (b[0] Xor0x89 + (100 /2) << 2 - 123 >> 2) == 0Then SetData(Toggleflag ,3x_Bin ,0,1)End IfToggleflag = 1b[0] = 13For i = 0To b[0] Step1a[i] = 20 + i * 10NextIf i < b[0] - 1ThenGetData(a[0] ,0x_Bin ,0,1)If a[0] <> 1ThenEnd IfElseSetData(c ,3x_Bin ,2,1)End IfWhile1If Toggleflag == 1ThenBreakEnd IfWendReturn ToggleflagEnd SubMacro_Command main( )int a[250]int b[250]int iGetData(a[0] ,3x_Bin ,2,2)a[0] = a[0] + 5a[1] = a[1] + 5If a[0] >= 150Thena[0] = 5End IfIf b[0] >= 100Thenb[0] = 5End Iffunc1() == 1End Macro_Command11: 死循环(1)Macro_Command main( )int a[250]int b[250]int i = 1a[0] = 1b[0] = 2While a[0]While b[0]b[i ] = 10 + i * 10If b[i] == 210ThenSetData(i ,3x_Bin ,0,2)b[i] = 10BreakEnd Ifi = i + 1WendIf b[i] == 200ThenSetData(b[0] ,3x_Bin ,0,4) BreakEnd IfSetData(b[0] ,3x_Bin ,0,3)WendEnd Macro_Command(2)Macro_Command main( )char Toggleflagint a[13]int b[14]int c = 4848char i = 0b[0] = 13While b[0]a[i] = 20 + i * 10If a[i] == 120Thenc =200ContinueEnd Ifi = i + 1If c == 200ThenSetData(c ,3x_Bin ,2,1)BreakEnd IfWendEnd Macro_Command12: 死机int x = 0int yfloat fSub func0()If y == 1Theny = 2Else If y == 3ThenReturnEnd IfEnd SubSub char func1()char Toggleflagint a[10]int b[10]int c = 4848char ib[0] = 13For i = 0To b[0] Step1a[i] = 20 + i * 10NextIf i < b[0] - 1ThenGetData(a[0] ,0x_Bin ,0,1)If a[0] <> 1ThenEnd IfElseSetData(c ,3x_Bin ,2,1)End IfToggleflag = 0If (b[0] Xor0x89 + (100 /2) << 2 - 123 >> 2) > 0Then GetData(Toggleflag ,0x_Bin ,0,1)End IfWhile1If Toggleflag == 1ThenBreakEnd IfWendReturn ToggleflagEnd SubMacro_Command main( )int a[250]int b[250]int iEB500 Macro 使用说明 GetData(a[0] ,3x_Bin ,2,2)a[0] = a[0] + 5a[1] = a[1] + 5If a[0] >= 150Thena[0] = 5End IfIf b[0] >= 100Thenb[0] = 5End IfIf func1() == 1ThenSetData(a[0] ,3x_Bin ,2,2)End IfEnd Macro_Command。
瓦萨变频器通讯协议新串口通讯协议_SUN

驱动器内部设 0~0xff 0~255 对应变频器的内部参数号码
定参数
(F000~F255)
驱动器内部控 0x2000 8192 控制指令 制参数
0x2001 8193 设置频率
驱动器内部状 0x2100 8448 运行频率 态参数
0x2101 8449 输出电流
0x2102 8450 直流母线电压
址。
nnn
:参数号码为三位数“nnn”,参数号码由000~255。
tt :回复参数之小数点类型。
tt=4,特殊类型整数
tt=3,两位小数
tt=2,一位小数
tt=0,整数
ddddd :回复之参数值(00000~65535)。
s
:回复变频器输出状态。
s=1,变频器逆转输出中。
s=2,变频器正转输出中。
s=3,变频器停止。
Low CRC CHK(校验)
High END
n×8-bit数据内容(n<=25)
CRC校验值值 大于10 ms的间隔时间
ADR(通讯地址) 合法的通讯地址范围在 0 到 99 之间。通讯地址为 0 表示对所有 变频器进行广播,在此情况下,变频器将不会发送回复信息。通讯对应 的地址规定如下:
项目
地址 功能说明 (Hex/Dec)
通讯界面
说明
T=0
Ascii通讯模式,RS232
T=1
Ascii通讯模式,RS485
T=2
Modbus RTU通讯模式,RS232
T=3
Modbus RTU通讯模式,RS485
3. 通讯格式设定说明如下:
通讯格式
说明
F=0
2400bps, 7Databits, Even Parity,2Stopbits
MATLAB串行通信的实现方法

MATLAB串行通信的实现方法1.硬件串口通信方法硬件串口是计算机与外部设备(如传感器、微控制器等)之间进行数据传输的接口。
要使用硬件串口进行通信,首先需要连接计算机和外部设备。
接下来,可以按照以下步骤在MATLAB中实现串行通信:步骤1:确定串口参数使用MATLAB提供的命令`instrhwinfo('serial')`来查看计算机上可用的串行端口和其相关信息。
根据需要,选择合适的串口参数,包括波特率、数据位、停止位和校验位等。
步骤2:创建串行端口对象使用`serial`函数创建一个串行端口对象,并指定串口号和参数。
例如,`s = serial('COM1', 'BaudRate', 9600)`将创建一个串行端口对象s,并设置波特率为9600。
步骤3:打开串口使用`s`对象的`fopen`函数打开串口连接。
例如,`fopen(s)`将打开与外部设备的串行通信连接。
步骤4:收发数据使用`s`对象的`fread`和`fwrite`函数进行数据的接收和发送。
例如,`data = fread(s, n)`将从串口接收n个字节的数据并存储在变量`data`中,`fwrite(s, data)`将发送变量`data`中的数据到串口。
步骤5:关闭串口`fclose(s)`将关闭串行通信连接。
2.虚拟串口通信方法虚拟串口是一种通过软件模拟的串口,可以在计算机上模拟硬件串口的功能。
使用虚拟串口进行通信时,不需要实际的硬件设备,只需要安装虚拟串口软件即可。
以下是使用虚拟串口进行通信的方法:步骤1:安装虚拟串口软件步骤2:创建虚拟串口对在虚拟串口软件中创建一个虚拟串口对,一个作为发送端口,一个作为接收端口。
将发送端口与接收端口进行连接。
步骤3:创建串行端口对象使用`serial`函数创建一个串行端口对象,并指定虚拟串口对的接收端口。
例如,`s = serial('COM3', 'BaudRate', 9600)`将创建一个串行端口对象s,并设置波特率为9600。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Operation Manual of PanelMaster
使用宏指令执行串口通讯
Neomate Technologies Inc.
串口是计算机上一种非常通用的通讯协议,同时也是大多数仪器仪表设备的通用通讯协议。
在触控屏应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。
除了触控屏软件PanelMaster自带的许多驱动之外,我们也可以设计相应的串口通信程序,完成二者之间的数据通信任务。
串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据。
引脚 功能说明 缩写
1 数据载波检测 DCD
2 接收数据 RXD
3 发送数据 TXD
4 数据终端准备 DTR
5 信号地 GND
6 数据设备准备好 DSR
7 请求发送 RTS
8 清除发送 CTS
9 振铃指示 DELL
串口主要信号线定义
电气特性:数据传输速率最大可到20K bps,最大距离仅15m,一般在9600 bps,可以满足通讯需求。
PV提供了最通用的串口通讯服务General Device(COM)。
使用串口通讯需选择服务General Device(COM),设置为
我们假设两台屏之间的串口通讯.接线图如下:
A触控屏的连接设置为:
B触控屏的连接设置为:
由此可以看出,触控屏A是通过COM1和屏B的COM2进行通讯的,它们都使
用PanelMaster的General Device(COM)服务。
要使用宏指令实现串口的通讯,我们需要了解General Device(Com)。
General Device(Com) 说明
控件类别 代号 名称 存取
方式
说 明
Bit Device CTS_STS CTS 状态 只读该状态是程序从接收方读到的状
态,1表示禁止发送, 0 表示允许发
送,当EN_HS为1时,程序在发送前
检查该状态,等待直到允许发送时才
能发送,否则此次发送失败。
写此状
态没有作用。
Bit Device EN_HS 检查握手信号 读写当该状态为1时,程序在发送前检查
CTS_STS是否允许发送,并且在发送
前禁止对方发送,并在发送结束后允
许对方发送。
Bit Device FLUSH 清空接收缓冲
区 只写写1清空接收缓冲区, 写0没有作用。
读此状态为0。
Bit Device RESET UART复位并清
空接收缓冲区 读写写 1 UART复位并清空接收缓冲区,所有状态恢复为初始状态 写0没有
作用。
读此状态为0。
Bit Device RTS 设置(SET)RTS
信号 读写设置该状态为1,禁止对方发送,0允许对方发送。
Word Device RX 数据接收 只读从接收缓冲区中读取N个字符。
当
接收缓冲区中的字符数量大于等于
N时, 读出N个字符。
RX_CNT为
N,RXB_CNT=RXB_CNT-N。
否则读出
RXB_CNT个字符,RX_CNT =
RXB_CNT,RXB_CNT=0。
写该寄存器
无作用。
每一次接收,RX_STS=1成
功,RX_STS<0 硬件错。
Word Device RX_CNT 实际接收字符
数 只读上一次读取接收缓冲区实际读出的字符数量。
写该寄存器无作用。
Word Device RX_STS 接收结果 只读上一次接收是否成功。
1:成功,2:
超时,<0:失败。
写该寄存器无作
用。
Word Device RX_W 等待接收数据 只读从接收缓冲区中读取N个字符。
当
接收缓冲区中的字符数量大于等于
N时, 读出N个字符。
RX_CNT为
N,RXB_CNT=RXB_CNT-N, RX_STS=1
成功。
否则等待直到超时。
如果
RXB_CNT仍然小于N,读出RXB_CNT
个字符,RX_CNT = RXB_CNT,
RXB_CNT=0,如果硬件出错RX_STS<0
失败,否则RX_STS=2超时。
写该
寄存器无作用。
Word Device RXB_CNT 接收缓冲区中
字符数 只读接收缓冲区中的字符数量。
写该寄存器无作用。
Word Device TO_TIME 超时时间 读写设置接收发送的超时时间,单位为
100MS。
Word Device TX 数据发送 只写发送数据到指定串口。
一、等待上
一次发送完成。
二、如果EN_HS等
于1,等待对方允许发送,即
CTS_STS=0。
三、 如果EN_HS等于
1,发送前设置RTS=1,并在发送结束
后设置RTS=0。
四、如果开始发送
前已经超时TX_STS=2超时返回。
五、开始发送TX_STS=1成功并返
回。
Word Device TX_STS 发送状态 只读上一次发送是否成功。
1:成功,2
超时, 0XFF正在发送中。
写该寄存
器无作用。
Word Device TX_W 数据发送并等
待完成 只写发送数据到指定串口。
一、等待上一次发送完成。
二、如果EN_HS等
于1,等待对方允许发送即
CTS_STS=0。
三、如果EN_HS等于
1,发送前设置RTS=1,并在发送结束
后设置RTS=0。
四、如果开始发送
前已经超时TX_STS=2返回。
五、开
始发送。
六、等待发送结束,设置
TX_STS=1。
发送和接受的控制流程如下:
例1:两台屏通过宏指令实现串口通讯
触控屏A中的宏指令为TX= MOV($U200,4)
使用一个按钮来作为发送按钮
位按钮的写入地址可以自己定义。
这里使用内部地址$U1.0,功能选择保持1。
此按钮的壹宏为
当按下出发送按钮时,就会执行此宏指令,指令使用MOV命令将内部记忆区 $U200~$U203暂存器(寄存器)搬移到TX暂存器(寄存器)发送。
例:触控屏B中的宏指令为 $U100= MOV(RX,4),此宏指令设置为主宏指令。
使用MOV指令将RX暂存器(寄存器)接收到的数据搬移到内部记忆区 $U100~$U103暂存器(寄存器)。
以上的例子使用MOV指令将触控屏A中内部记忆区 $U200~$U203的数据通过串口通讯General Device(COM)传送到触控屏B的内部记忆区 $U100~$U103暂存器(寄存器)。
例2: 三菱PLC FX2N通过自由串口和屏通讯,实现屏和PLC的时间手动同步。
接线图如下:
PLC 的通讯程序如下
:
设置为8位处理模式
通讯参数设置
RS指令设置
发送数据等待
数据传送
输出接受数据
接受完成后完成复位
屏的连接属性如下:
连接属性的参数设定需要与PLC的通讯参数一样.通讯设置完之后,我们需要建立一个同步的按钮。
此同步按钮的功能选择保持1,写入地址可以地址定义,我们这里就使用内部地址$U1.0, 它的壹宏为:
TX=1,发送请求信号,让PLC通过串口发送时间数据到屏;$U200=MOV(RX_W,7), 接受来自PLC的时间数据并存入寄存器$U200-$U206;然后再转换数据,最后设置屏的内部时钟。
按钮的零宏为:
TX=0,复位信号
以上例子是通过串口通讯的方式,实现触摸屏和PLC之间的时间同步。
触摸屏通过宏指令的TX发送请求信号给PLC,然后再通过RX接受来自PLC的时钟信号,并加以转换,最后设定为内部时钟,从而通过屏的宏指令实现了和PLC的串口通讯。