上位机基于C#通过TCPIP和库卡机器人通讯

合集下载

基于Csharp的串口通信上位机和下位机源程序

基于Csharp的串口通信上位机和下位机源程序

基于单片机串口通信的上位机和下位机实践串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。

大多数计算机包含两个基于RS232的串口。

串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。

同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

它很简单并且能够实现远距离通信。

比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

首先亮出C#的源程序吧。

主要界面:只是作为简单的运用,可以扩展的。

源代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;using System.Timers;namespace 单片机功能控制{public partial class Form1 : Form{public Form1(){InitializeComponent();}SerialPort sp = new SerialPort();private void button1_Click(object sender, EventArgs e){String str1 = comboBox1.Text;//串口号String str2 = comboBox2.Text;//波特率String str3 = comboBox3.Text;//校验位String str4 = comboBox5.Text;//停止位String str5 = comboBox4.Text;//数据位Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型groupBox3.Enabled = true;//LED控制界面变可选try{if (button1.Text == "打开串口"){if (str1 == null){MessageBox.Show("请先选择串口!", "Error");return;}sp.Close();sp = new SerialPort();sp.PortName = comboBox1.Text;//串口编号sp.BaudRate = int2;//波特率switch (str4)//停止位{case "1":sp.StopBits = StopBits.One;break;case "1.5":sp.StopBits = StopBits.OnePointFive;break;case "2":sp.StopBits = StopBits.Two;break;default:MessageBox.Show("Error:参数不正确", "Error");break;}switch (str3){case "NONE":sp.Parity = Parity.None; break;case "ODD":sp.Parity = Parity.Odd; break;case "EVEN":sp.Parity = Parity.Even; break;default:MessageBox.Show("Error:参数不正确", "Error");break;}sp.DataBits = int5;//数据位sp.Parity = Parity.Even;//设置串口属性sp.Open();//打开串口button1.Text = "关闭串口";textBox1.Text = Convert.ToString(sp.PortName) + "已开启!";}else{sp.Close();button1.Text = "打开串口";groupBox3.Enabled = false;//LED控制界面变灰色textBox1.Text = Convert.ToString(sp.PortName) + "已关闭!";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void Form1_Load(object sender, EventArgs e){//初始化textBox1.Text = "欢迎使用简易的串口助手!";groupBox3.Enabled = false;//LED控制界面变灰色groupBox6.Enabled = false;groupBox7.Enabled = false;groupBox8.Enabled = false;button3.Enabled = false;button6.Enabled = false;timer1.Start();try{foreach (string com in System.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称boBox1.Items.Add(com);//默认设置comboBox1.SelectedIndex = 0;//选择第一个com口comboBox2.SelectedIndex = 4;//波特率4800comboBox3.SelectedIndex = 0;//校验位NONEcomboBox4.SelectedIndex = 0;//停止位为1comboBox5.SelectedIndex = 0;//数据位为8}catch{MessageBox.Show("找不到通讯端口!", "串口调试助手");}}private void timer1_Tick(object sender, EventArgs e){label6.Text = DateTime.Now.ToString();}private void button2_Click(object sender, EventArgs e){try {if (button2.Text == "开启"){groupBox6.Enabled = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;checkBox1.Checked = false;checkBox2.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;button3.Enabled = true;textBox2.Text = String.Empty;button2.Text = "关闭";}else{groupBox6.Enabled = false;button3.Enabled = false;button2.Text = "开启";textBox2.Text = String.Empty;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void button3_Click(object sender, EventArgs e){groupBox6.Enabled = true;label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败,请选择发送的数据!");elsesp.WriteLine(textBox2.Text);//往串口写数据}private void checkBox1_CheckedChanged(object sender, EventArgs e) {try {if (checkBox1.Checked){checkBox1.Checked = true;checkBox2.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;label7.Text = "准备发送";textBox2.Text = "1";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox2_CheckedChanged(object sender, EventArgs e) {try {if (checkBox2.Checked){checkBox1.Checked = false;checkBox2.Checked = true;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;label7.Text = "准备发送";textBox2.Text = "2";radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox3_CheckedChanged(object sender, EventArgs e) {try{if (checkBox3.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = true;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "3";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox4_CheckedChanged(object sender, EventArgs e) {try{if (checkBox4.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = true;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "4";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox5_CheckedChanged(object sender, EventArgs e) {try{if (checkBox5.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = true;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "5";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox6_CheckedChanged(object sender, EventArgs e) {try{if (checkBox6.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = true;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "6";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox7_CheckedChanged(object sender, EventArgs e) {try{if (checkBox7.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = true;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "7";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox8_CheckedChanged(object sender, EventArgs e) {try{if (checkBox8.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "8";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void button5_Click(object sender, EventArgs e){try{if (button5.Text == "开启"){radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;groupBox7.Enabled = true;button6.Enabled = true;textBox2.Text = String.Empty;button5.Text = "关闭";}else{groupBox7.Enabled = false;button6.Enabled = false;button5.Text = "开启";textBox2.Text = String.Empty;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void button6_Click(object sender, EventArgs e){label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败。

基于C++的欧姆龙PLC以太网通讯实现

基于C++的欧姆龙PLC以太网通讯实现

通信与信息处理Communication and Information Processing《自动化技术与应用>> 2020年第39卷第12朋基于C++的欧姆龙PLC 以太网通讯实现**基金项目:安徽省重点研究和开发计划对外科技合作项目《制冷(热 泵)机组用节能型全工况測试评价系统的研发》(编号201904bll020019) 收稿日期:2019-08-09陈熙,张成,黄维东,李晨安,王晓光(合肥通用机械研究院有限公司,安徽 合肥230031)摘要:本文介绍了一种采用FINS 信息服务的欧姆龙PLC 与上位机的通讯程序开发过程。

首先介绍了 FINS 协议指令的数据帧结构,然后阐述了PLC 的通讯设置与FINS 指令发送和响应。

最后,以欧姆龙CP1H 型PLC 为例,在C++ Builder 环境下利用Socket 实现的PLC 控制网络通讯代码实例。

结果表明,本程序通过以太网可以迅速完成上位机与PLC 的读写操作。

关键词:C++,欧姆龙PLC ;以太网通讯s FINS中图分类号:TP312 文献标识码:A 文章编号:1003-7241(2020)012-0066-04Implementation of OMRON PLC EthernetCommunication Based on C++CHEN Xi, ZHANG Cheng, HUANG Wei-dong, LI Chen-an, WANG Xiao-guang(Hefei General Machinery Research Institute Co., Ltd., Hefei 230031 China )Abstract: This paper introduces a communication program between OMRON PLC and PC using FINS information service. Firstly,the data frame structure of FINS protocol instructions is introduced, then the communication settings of PLC is expound ・ed. Finally, take CP1H PLC as an example, using C++ Builder environment, realizes PLC control network communication code by Socket. The results show that the program can read and write PLC quickly through ethemet.Key words: C++; OMRON PLC; Ethemet communication; FINS1引言PLC 在工业控制领域有着广泛的应用,随着信息技 术时代的来临,PLC 与上位机的通讯的需求越来越普遍传统的PLC 通过RS-232C 串口进行通讯,由于该通讯方 式速度慢、传输距离短的限制,难以满足现代控制系统数据量大、实时性强、长距离网络化传输的要求°巴为了解 决这个问题,欧姆龙出品了 CP1W-CIF41扩展接口单元, 该单元可以实现PLC 以TCP/IP 协议为基础的以太网通讯。

【第三章】C_上位机实战开发指南

【第三章】C_上位机实战开发指南

第三章Windows窗体程序3.1第一个窗体程序3.1.1新建本地工程文件夹为了使工程易于管理,我们首先在电脑本地新建一个文件夹用于存放整个共工程,比如命名为”DEMO”。

注意文件夹名虽然根据喜好命名,但最好不要使用中文命名,因为有时候如果上位机需要加载本地文件遇到中文名必须要转码,比如加载本地URL时路径存在中文就相对麻烦,因此我建议使用英文命名。

3.1.2新建工程启动VS2015,新建一个工程,如图3-1所示。

图3-1:在VS2015中新建工程1.选择.NET版本通常我们可以选择.NET2.0或者.NET4.0,.NET3.x版本兼容性差,BUG较多,几乎没有人使用,.NET4.5以上版本太高,不再支持Windows XP。

一般情况下,Windows XP已经很少使用.NET4.0,而.NET2.0可以流畅的在Windows XP及其以上版本系统上运行,即使在企业级开发中4.0也已经算非常高的版本了,因此出于兼容性的考虑,建议选择.NET2.0进行开发。

当然在讲到波形绘制项目时,我们会优先选择.NET4.0。

2.选择项目类别上位机开发选择Windows窗体应用程序。

3.命名项目名建议使用英文名命名,避免路径中出现中文,这里我取名”Demo”。

图3-2:创建项目我们将新建的工程放置于DEMO文件夹中即可。

此时VS2015切换至窗体设计器界面。

4.控件及属性栏介绍Windows窗体程序离不开控件的使用,在新建好工程后我们就需要找到Windows原生的控件库。

在界面左边的工具箱中就存放着所有我们可能会用到的Windows原生控件。

一般情况工具箱会自动隐藏,考虑到设计界面时我们需要比较大的空间去揣摩界面设计思路,因此建议使用时都将工具箱隐藏,用到时再选择控件即可。

当然出于个人喜好又或者开发电脑有一个非常大的屏幕,我们也可以将工具栏显示在设计器界面中。

属性栏一般在界面右下角,使用频率非常高,控件样式,事件的注册等都需要在属性一栏中进行设置。

大功率中频逆变电阻焊机交互系统的设计

大功率中频逆变电阻焊机交互系统的设计

u p r n y RS 3 rn t o k, n o p e e b 2 2 o e w r a d c mmu iae v a S 1wi P,e ev n in l fd t ci g s s m i 0. h o ru y t m o n c t i P t DS r c ii g sg a so e e t y t va 1 T e p we ls se h n e f 方便快捷 地操 作 电焊 机 。 该 系统 构建 在数 字 化焊 接 电源 的基 础上 , 用 采
收 稿 日期 :0 0 0 - 2 2 1- 5 1
基金项 目: 广州市科技局科技攻关计划资助项  ̄(6 1 10) 0A10 27
1 电 焊 机 交 互 系 统 功 能 介 绍
入数据库 技术 , 里选用 A O连接 A cs 数 据库 , 这 D ces
通 信 方 面 , 口采用 A t e 串 ci X控 件 C C m 进行 v MS o m 操作 , 网络通信 采用 Wisc 。 nok
22 功 能分 析 .
焊 机 界 面要 实 现 的主 要 界 面是 管 理焊 接 控制 器 , 置参数规范 、 设 监控 , 图 2 示。 界面可 以用 如 所 该
Ab ta t T e d s n o te it a t e ss m frdgt e e es e b de h u e o t bo g tb e e dg i t nti sr c : h e i f h ne c v y t o i i d w l r m o i te s p r r y ru h y w l r i t a o . s g r i e iz d s ii d iz i h
少 数 几 家 厂 商 有 较 好 的 交 互 产 品 , 价 格 较 贵 。 对 但 针 这种 情 况 , 项 目设计 了一 种 电焊机 的人 机 交互 系 统 。 本

基于PLC自由通信的CRC校验算法实现

基于PLC自由通信的CRC校验算法实现
Z C C校验算法 R
多项式除法可用除法电路来实现。C C编码采 R 用的除法运算是模 2 除法, 它与算术除法类似, 但每一 位除( 的结果不影响其他位, 减) 即不向上一位借位, 故实际上就是异或, 因此,R C C校验的除法电路可由 一组移位寄存器和模 2 加法器( 异或单元) 组成。 以c CI u为例, 6 级移位寄存器和 3 R一 T 它由1 个 加法器组成, 1 如图 所示( 编码/ 解码共用) 。编码/ 解 码前将各寄存器初始化为“ ” 信息位随着时钟移人。 1, 当信息位全部输人后, 从寄存器组输出 C C结果。 R c c校验码的计算可以靠专用的硬件电路来实 R
该算法的基本依据为: 计算本字节后的 C C码, R 等于
上一字节余式 C C码的低 8 R 位左移 8 加上上一字 位, 节 C C右移 8位和本字节之和后所求得的 C C码。 R R
信号长度为 叭生成多项式用以x 表示,( 的最高 ) 9x ) 幂次为n一 k二r R 校验码多项式用 R x 表示; C ; C ( ) 编
码后将一组由原始信息码和 C C校验码组成的数据 R 块称为一个码元 , T 劝 表示。 用( 发送方编码方法 : 尸 x 乘以 了( 将 ( ) 即对应的二进 制码序列左移 ; , 尸 x 的右边就会空出n一 位)这样 ( ) k
以 C CIU为例,R R一 T C C校验码的计算步骤如下:
ie r c ai o t yt . n r e e bi f h 出 m t n e f l y t es e
HUJ 一u i ha n
K yw 川5 ccc dnac cek( R ) p Cfeo o m n ao ; R 一 U cd addcd eo : yl r udny hc C C ; L r dmCm ui tn C CI ; oe n eoe ie e ci T

c上位机毕业设计

c上位机毕业设计
c上位机毕业设计
篇一:单片机课程设计--上位机
《单片机接口设计》
课程设计报告
班级:电1001-2班 姓名:齐春叶学号: XX2496日期:6.26--7.07
一.课程设计要求
1.按时呼唤下面每一个下位机(如5_E(如3_E) 2.可通过按键决定反复呼唤某个地址
参数设置
图2. 软件组织结构
3 上位机用户操作界面的成立
3.1 编程语言及编程环境
3.1.1 C++语言介绍
C++是脱胎自C语言的一种中级语言。从运算机角度看, 它能够嵌入ASM等低端语言; 从面向对象的程序设计角度看, 它有具有OOP的三个大体特点——抽象, 封装和继承。
C语言是结构化和模块化的语言,它是面向进程的。C++保留了C语言原有的所有优势,增加了面向对象的机制。C++与C完全兼容。C++是对C的扩充,是C的超集。它既可用于结构化程序设计,又可用于面向对象的程序设计,功能壮大。
摘要:随着运算机、电子、通信技术的飞速进展,人们关于车间现场设备的运行治理操纵,可视化操作等综合水平提出了新的要求。
为了知足这新的要求,本毕业设计本着“不在现场,远离现场”的原那么,以C语言作为开发语言,VC为开发环境,针对某充电机产品编写了应用程序,将充电机的现场设备界面通过串口通信技术,与上位机界面有机的结合起来,以实现运算机的远程监控功能。另外,该上位机应用软件还实现了查看充电机存储在U盘中的运行记录文件的功能。
C++性能良好,因为它被编译为机械代码。关于VBScript和Java等语言,代码在运行时由程序说明,而且每次运行程序时都要将代码转换为机械码,如此做效率比较低,不单单是已编译过的C++程序运行得较快,而且微软C++编译器已存在连年。这意味着微软的编译器程序员已经把许多优势集中到编译器上,以致于它能产生超级高效的机械码。因为C++是编译语言,而且超级自然,比VB更接近机械代码,因此由C++编译器产生的代码必然比VB的编译代码效率更高。

基于MFC的飞思卡尔智能车上位机设计

基于MFC的飞思卡尔智能车上位机设计众所周知,上位机在智能车调试中起着重要作用,尤其是通过无线串口,实现数据实时发送接收,极大方便了智能车调试。

作者以VC6.0为平台使用微软MFC,简单介绍串口上位机设计,抛砖引玉。

STEP1.新建MFC工程STEP2.加入串口类VC6.0进行串口开发主要有两种方式,一种是利用微软控件MScomm,一种是利用开源类CSerialPort。

但是前者编译生成的程序在其他电脑上运行还要注册控件,略显麻烦。

而后者属于对windows API封装,使用方便,兼容性强。

本文重点介绍CSerialPort的使用。

在/serialport.html下载最新CSerialPort类,工程中添加.h 和.cpp文件,如下图。

在serialDlg.cpp和serialDlg.h中包含Cserialport头文件同时在serialDlg.h中定义对象CSerialPort m_SerialPort; //CSerailPort类对象STEP3. Cserialport必备函数STEP4.窗口布局设置成员变量(Ctrl+W ),四个编辑框对应四个UNIT成员变量STEP5.串口初始化OK,所有前期工作准备完成,开始串口操作按钮“打开串口”,双击,创建消息函数void CSerialDlg::OnOpenserial() 实现串口初始化,代码如下按钮“关闭串口”,双击,创建消息函数void CSerialDlg::OnCloseserial() 函数功能为进行串口初始化,代码如下STEP6.串口数据发送按钮“发送”,双击,创建消息函数,代码如下STEP7.串口数据接收手工建立WM_COMM_RXCHAR的消息映射处理函数OnComm() 首先在serialDlg.h中添加响应函数声明在serialDlg.cpp中添加消息响应At last,VC串口通讯程序基本功能,打开串口,关闭串口,接收数据,发送数据均以完成。

基于C_Hooks的MasterCAM_刀具清单_功能开发


3.1 实现对 MPPARAM.DLL 的调用
要实现 Toollist.DLL 的刀具参数读取功能, 必须建立与
MPPARAM.DLL 之间的动态链接库通信。 因此在 Toollist 的
CPP 中应调用 MPPARAM.DLL 的参数读取函数, 具 int觹 re-
set, / / 重置输入文件;
1 MasterCAM 中参数信息的传递流程分析[1]
MasterCAM 中 用 户 可 以 进 行 二 维 、 三 维 建 模 , 编 制 刀 具路径, 然后通过不同的后置处理程序生成适合于不同数 控 系 统 的 NC 程 序 。 为 保 证 NC 程 序 的 准 确 性 , 要 求 在 这 一 过 程 中 各 种 相 关 的 参 数 信 息 必 须 完 整 无 误 地 传 递 到 NC 程序中。 以 FANUC 数控系统的后置处理为例, MasterCAM 中 一 个 完 整 的 参 数 信 息 传 递 流 程 如 图 1 所 示 。 MasterCAM 中一个完整的参数信息传递包括以下三个方面。
图 6 PLC 梯形图
该 系 统 是 全 年 24 小 时 开 机 运 行 的 , 现 原 中 央 空 调 系 统平均每天用电:
(1298.4+1117.6) / 2 = 1208 千瓦时。 以此每天用电量计算, 则原中央空调系统全年用电: 1208×365 = 440920 千瓦时。 使用了节能系统后, 按照全年最低 平 均 节 电 率 12%计 算, 整个系统可节约用电: 440920×12%=52910.4 千瓦时。 折合人民币: 52910.4×0.81=42857.4 元。 由以上数据得出, 节能系统至少能为业主这个中小 型 中 央 空 调 系 统 每 年 节 约 4 万 元 以 上 的 电 费 。 以 每 年 20 个工程, 每个工程节约 4 万元来统计, 节能系统为企业、 为社会每年可节约上百万元的电费。 将来节能工程在社 会铺开以后, 将大大减轻了国家供电的压力, 间接减少

单片机上位机界面编程软件一览

目前用在单片机嵌入式上位机编程的开发工具有很多,让很多刚入门的工程师们无所适从。

那么用来编写单片机嵌入式上位机的工具有那几款呢?下面小编为大家细数一下使用最普遍的几款。

(1)LabVIEW:是NI推出的,和C和BASIC开发环境类似,但是LabVIEW与其他计算机语言有很大区别,其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。

特点是:采用了通用的硬件,可以通过改变软件在计算机上实现多种仪器的功能。

被公认为测试之王。

2)VB:是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。

从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。

它源自于BASIC编程语言。

VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。

程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

(3)VS:它是微软提供的一个工具集,由各种各样的工具组成。

VS可以支持C/C++、VB、JAVA、C#编程。

然了一次只能支持一种编程方式。

在VS安装完成,第一次运行的时候会让你选择常用语言,如果你选择C/C++,那么他就成了能够进行C/C++编程的平台也许就是你所说的VC了。

如果不想用C/C++的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。

所以总的来说它是一个集成平台。

真正地组件编程。

基本上,Qt同X Window上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。

基于C#的极低功耗无线网络温度监测系统的上位机软件设计


dsrb t n a d t a b wiey p le i v o tpe o wiee s aa o itiui , n i n o C e d l a pid n  ̄ us y s f r ls d t c mmu c t n , e vi n e t niai s n r m n mo trng n sc rt o o ni i a d e ui o y
s se .Th s a e i to u e t e y t ms i p p r n r d c s h me h d f wrtn t e e a c mmu i a i n s f a e b t e n M S 3 M CU a d C b i g t o o ii g h s r l o i n c to o w r e t w e  ̄ 0 n P y usn C≠ l n u g . a d nay e t e } a g ae n a l z s h C≠ b s d } a e PC o t r d sg 一 s fwa e e in t c n l g f r e h o o y o wie e s e o k e e a u e r ls n t r t mp r t r mo io n s s e w n t r g y t m i i n
12 网 络 组成 . O 引言 该无线传感 器 网络 由一个 主站节 点和若干个 无线温 度传 无 线传感器 网络是 由大量传感 器节点 通过无 线通信技 术 同时采 自 组织 构成的网络 , 具有广 阔的应用前景 , 为是 将对 2 世 感器节点构成 。传感器节点负责 中转其他节点数据包 , 被认 1
积 小等特 点 , 能实现 随机分布的传感 器网络 自组织 , 以广泛地应 用于各类无线数据通讯 、 可 环境监 测、 防 系统等领域。 安 文章介绍 了采用 c 语 言编写MS 4 0 片机与 P P3单 C机之 间的 串行通信软件的方法 , 分析 了基 于c 的极低功耗 无线 网络 温 撑
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上位机基于C#通过TCP/IP和库卡机器人通讯
上位机要想和库卡机器人通讯,首先要给机器人安装“ETHERNETKRL”这个软件,ETHERNETKRL是KUKA提供的一个以太网通信功能的软件包,支持TCP和UDP协议.但具体软件的安装以及初步通讯测试就不多做介绍了。

如果你没有C#编程的相关基础,可以先参考:
因为本文不是介绍该软件的安装,所以就不多做解释,下面的内容默认已经能用自带的测试软件获取库卡机器人发送过来的数据。

在此基础上,我来说一下c#利用tcp/ip 是如何跟库卡机器人进行通讯的.如果你对TCP/IP或者网络协议还有疑问,可以先参考:
首先当然是TCP/IP的基础部分,服务器和客户端。

这里将库卡机器人作为客户端,上位机作为服务器进行通讯。

通过按钮事件,创建后台线程用于TCP服务端,创建服务端并开启监听后,就可以等待机器人客户端发来的消息了。

库卡机器人TCP通讯存在三种数据发送格式:固定长度字节,任意长度字节,和xml 格式。

个人感觉xml格式比较好用,这里介绍xml的通讯。

xml的通讯,其实可以分解为几个步骤:
机器人发送到上位机:机器人程序将变量或者数值写入xml的元素中→机器人将xml 发送通过服务端发送到上位机的服务端→服务端接受到数据,按照xml的格式解析其中元素。

上位机服务端获取到的数据是:
<Robot><Data><LastPos X="483.980011" Y="7.210000" Z="239.869995" A="0.000000" B="0.000000" C="0.000000"></LastPos><ActPos X="1000.119995"></ActPos></Data><Status>12345678</Status><Mode>
ConnectSensor</Mode><RobotLamp><GrenLamp><LightOn>1</LightOn> </GrenLamp></RobotLamp></Robot>
然后对数据进行逐个元素的解析就可以了。

要增加变量,只要对应在mxl文件,机器人程序和上位机解析过程中添加就可以了。

上位机发送到机器人:上位机将变量写成xml格式,利用客户端发送到机器人中的xml 文件→机器人读取xml文件中的元素值到程序中的变量
写成xml格式:
sendstr = sendstr + "<Sensor><Status><IsActive>FALSE</IsActive></Status></Sensor>"; sendstr = sendstr + "<Sensor><Read><xyzabc X='10.0' Y='20.0' Z='30.0' A='40.0' B='50.0' C='60.0'></xyzabc></Read</Sensor>";
然后是tcp发送
等发送完成之后,机器人再读取
机器人从xml元素中读取值或者属性并赋予创建的变量
RET=EKI_GetString("XmlCallBack","Sensor/Message",valueChar[])
RET=EKI_GetInt("XmlCallBack","Sensor/Nmb",valueInt)
RET=EKI_GetBool("XmlCallBack","Sensor/Status/IsActive" ,valueBOOL) RET=EKI_GetFrame("XmlCallBack","Sensor/Read/xyzabc",valueFrame)
然后就可以在机器人程序中使用,或者通过查看变量值检测是否正确
本例中的xml文件和机器人程序文件src由ETHERNETKRL软件中自带的测试例子修改而来。

不用原例子的原因是,原例子只有程序文件src而没有数据文件dat,程序里的变量都是临时变量,无法在示教器上查询变量的值。

所以新建了一个程序,将原例子的变量定义放在dat数据文件中,处理过程放在src程序文件中。

另外,对上位机发送到机器人的元素有做一些删改。

相关文档
最新文档