自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(120)
  • 资源 (1)

原创 学习open62541 --- [37] 与KEPServerEX进行简单通信

主要讲述如何使用open62541的Client功能来和KEPServerEX进行简单通信。

2020-09-22 21:22:11 132

原创 学习CANopen --- [4] 对象字典

对象字典英文叫Object Dictionary, 简称OD,功能类似数据库。

2020-09-15 22:52:25 95

原创 Python3 argparse简明教程

介绍Python3命令行解析模块argparse的常规使用方法

2020-09-02 17:29:54 66

原创 学习open62541 --- [36] Client异步执行method

讲述Client如何异步执行Server提供的方法

2020-08-23 23:12:18 98

原创 学习open62541 --- [35] Server异步执行method

本文主要讲述Server端如何异步(async)执行method

2020-08-16 11:58:28 158 3

原创 学习open62541 --- [34] 保持连接

如何实现Client在安全通道超时前自动重新创建安全通道,然后保持与Server的连接。

2020-08-13 21:29:13 173

原创 C语言实现简单进度条

本文灵感来源于这篇文章,对其进行改进并改用C语言实现,运行环境是Debian10, Ubuntu也是一样的。代码实现#include <stdio.h>#include <string.h>#include <unistd.h>// ****************************** 配置 ***************************// 最后100%时的输出形式 const char * LastStr = "[--------

2020-08-12 11:00:02 81

原创 学习open62541 --- [33] 加密(使用OpenSSL)
原力计划

从open62541 v1.1版本开始,支持使用openssl进行加密,之前的版本只支持使用mbedtls加密。Linux系统下基本都默认安装了OpenSSL,使用起来会比较方便,Windows下安装OpenSSL也非常简单。本文主要讲述如何使用OpenSSL进行加密通信。一 下载和编译open62541去https://github.com/open62541/open62541/releases下载v1.1.1的release源码,选择zip或tar.gz格式的都行。这里下载zip格式,然后

2020-07-12 15:33:52 546 1

原创 Linux下libevent的简单使用

libevent是个高效的异步事件通知库,本文主要讲述在Linux下如何简单使用该库。一 下载本文写作时使用的版本是2.1.11,下载地址是https://github.com/libevent/libevent/releases/tag/release-2.1.11-stable本人下载的是zip文件。二 编译把第一步下载的压缩文件放到linux下。先解压,然后按照github上给的教程,在源码根目录下新建build目录,并cd进入,最后执行下面的2个命令进行编译(需要事先安装cmake

2020-07-01 22:53:57 99

原创 学习open62541 --- [32] 正确获取系统时间

client和server进行通信时,有时会要求获取server的系统时间,如用来查看某一事件发生的具体时间。在之前的系列文章中获取系统时间一直用的是UA_DateTime_now(),这个API获取的时间是UTC时间,即世界协调时间,而我们身处中国,其具体时间为:中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。PS:这个8是指8小时下面首先让我们看下UTC时间的打印表现,以及如何获取正确的系统时间。一 现

2020-06-13 12:02:18 233 2

原创 学习open62541 --- [31] 正确显示中文字符

本文主要讲述在win10下如何正确的显示中文字符。

2020-06-08 21:18:40 310 2

原创 学习CANopen --- [3] NMT报文
原力计划

本文主要讲述CANopen中的NMT报文,即网络管理(Network ManagemenT),该服务可以用于启动网络和监控设备。属于Master/Slave模式。NMT报文由NMT主机发送,对从机进行启动、监控和重启,在CANopen网络中只允许有一个活动的NMT主机。如果网络中有多个设备可以配置成主机,则只有一个可以配置成主机。一 NMT报文格式由于NMT报文属于...

2020-06-06 10:24:13 323

原创 OPC UA开源库介绍

本文主要简单介绍一下OPC UA相关的开源库,这样大家可以根据需要去选择使用。关于OPC UA的本质,这篇博客讲的挺好,可以看下。以下排名不分先后。1. open62541这个是本人经常使用的库,支持跨平台,支持异步,文档写的也很好。下面是该库的信息,官网地址:https://open62541.org/Github地址:https://github.com/open62541/open62541语言:C/C++License:Mozilla Public License v2.0官方教

2020-05-31 11:58:57 1107 4

原创 CRC32计算方法
原力计划

最近项目中要使用crc32来计算checksum,先是使用python3的zilib库进行计算,算出的值作为参考(使用zlib.crc32()方法)。然后使用网上拷贝的C代码来算,结果算出的crc32值与zlib.crc32()算出的不相等,于是又从网上找了各种计算crc32的C代码,发现都不相等…所以,本人决定从zlib源码下手去进行探索,下面是整个过程。一 Python3计算crc32使用以下代码生成crc32作为标准值,import zlibbytesData = b"\x01\x02\

2020-05-28 21:29:52 319

原创 学习open62541 --- [30] StatusCode便捷查看

OPC UA提供了很多服务,当使用这些服务时,一般都会有个返回值,表示使用过程中是否发生错误,这个返回值就是StatusCode,在open62541里其类型是UA_StatusCodetypedef uint32_t UA_StatusCode;从定义可以看出其实际类型是一个32位无符号整型数,每一个StatusCode都有一个特定值。下面就看下在open62541里其实如何定义和查看的。open62541中的情况在编译open62541时,会通过tools\schema\StatusCod

2020-05-27 20:56:04 271 5

原创 学习open62541 --- [29] 数据源的使用细节
原力计划

在这篇文章中简单介绍了数据源的使用,本文会进一步介绍数据源的使用细节,可以让我们更好的使用它。一 数据源API数据源的API有以下几个,UA_StatusCodeUA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, const UA_Node

2020-05-23 14:09:43 609 5

原创 C++构造函数初始值列表的必要性

一 疑问最近看到一段代码,如下,#include <iostream>class Little{public: void func() { std::cout << "hello 123\n"; }};class Big{public: Big(Little& one, int data) : m_li(one), m_data(data) { } void func() { m_li.func(); } int ge

2020-05-17 12:47:53 266

原创 C/C++函数参数为指针时的注意事项
原力计划

我们在编写函数时,有时参数会有指针,这时候就需要注意了。下面以例子来解释注意事项。一 例子原型假设我们有个简单的C++类(C原理类似), 如下,class Test{public: Test() { m_ptr = nullptr; } void setPtr(int *ptr) { m_ptr = ptr; } int *getPtr(void) { return m_ptr; } private: int * m_ptr;};这个类有个私有指针

2020-05-10 12:14:05 149

原创 Python把整数转换成16进制字符串

我们想把一个整型数据转换为字符串,常用的方式是直接使用str(),但是有时想转成16进制的字符串形势,如125转为'0x7D'这种,下面就讲述2种方法来实现这个目的,1. 使用hex()data = 125print(hex(data))打印如下,如果整型数据时2,则打印为可以看到hex()确实可以把整数转为16进制形式的字符串,但是有点美中不足,如字符小写,数字是16以下就会只占一个位置,有时要打印多个数据,希望整齐划一都占2个位置就无法满足需求了。这时可以使用format()方法。2

2020-05-08 20:07:54 2719

原创 golang gui库fyne的简单尝试

fyne是基于go编写的GUI库,可以运行在桌面端和移动端,样式风格使用的是Material Design,其github地址是https://github.com/fyne-io/fyne本文主要讲述如何在Windows下初步使用fyne一 安装1. 安装golang版本要大于1.12,这个网上各种教程,可以自行搜索。2. 安装fyne去地址https://github.com/f...

2020-05-01 10:04:22 2572

原创 学习open62541 --- [28] NodeSet释义
原力计划

NodeSet就是节点集合的意思,NodeSet可以提供一套设置好的节点,用户可以直接拿来使用,不用自己去重新创建,每个NodeSet有一个自己的NameSpace。本文主要讲述NodeSet在open62541里是如何起作用的以及使用方法。一 open62541默认提供的NodeSet打开open62541源码根目录下的CMakeLists.txt,找到如下语句set(UA_NAMES...

2020-04-25 14:53:10 550

原创 学习CANopen --- [2] PythonCANopen简单用法
原力计划

本文主要讲述如何在Linux下使用python进行简单的CANopen通信,使用了一个叫CANopen for Python的库,地址是https://github.com/christiansandberg/canopen该库作者还写了相关的教程,地址是https://canopen.readthedocs.io/en/latest/,可以直接去看这个教程,只是这个教程是英文的,不过也不难。...

2020-04-18 14:08:22 665

原创 学习CANopen --- [1] CANopenSocket简单用法

本系列文章主要用来学习CANopen,使用开源软件库CANopenSocket进行学习,因为这个可以不用实际的CAN设备,对于学习理论还是很有用处的。一 下载源码地址是https://github.com/CANopenNode/CANopenSocket...

2020-04-15 21:33:32 552 2

原创 学习open62541 --- [27] Discovery(使用LDS-ME)
原力计划

在上一篇文章中,我们讲述了如何使用LDS进行Discovery,本章讲述如何使用LDS-ME进行Discovery,ME是Multicast Extension的缩写,即多播扩展。既然使用LDS可以Discovery,那么为何还要使用LDS-ME呢?这个和应用场景有关,LDS:Client不知道网内有哪些Server,但是知道LDS地址,而且只有一个LDS,于是通过LDS去获取注册过的Ser...

2020-04-08 22:18:01 468

原创 学习open62541 --- [26] Discovery(使用LDS)
原力计划

Discovery中文的意思是发现,在OPC UA中Discovery是用来发现网络中的存在OPC UA Server,是个比较实用的功能。在之前的系列文章中,使用Client去连接Server,必须事先知道Server的地址和端口号,然后去连接Server,如果网络中存在多个Server,且Client不知道它们的地址和端口号,那么如何进行连接呢?这就需要Discovery功能了。下面就介绍...

2020-04-05 13:48:04 581

原创 通过虚函数表去理解C++多态
原力计划

C++里提到多态,大家都很熟悉,可以说多态是C++的一个基本概念。

2020-03-29 13:27:26 129

原创 学习open62541 --- [25] 使用建模工具SiOME
原力计划

讲述如何使用建模工具SiOME

2020-03-24 23:05:32 1276 17

原创 threejs简单样例

本人读研时使用过一段时间threejs,毕业后就没用过这个东西了,也没有从事相关的工作,这里重新拾起,以回忆当年的读研时光。运行环境OS:win10threejs版本:r112浏览器:Chrome v80.0.3987.149代码及运行代码来自《Learning Three.js: The JavaScript 3D Library for WebGL, Second Edit...

2020-03-22 18:17:34 181

原创 学习open62541 --- [24] 定时执行任务
原力计划

open62541提供定时执行任务功能,这个功能很实用,在前面的文章中,有时我们想定时的去修改一些变量节点的值,都是开一个线程去做的,相对来说有点小麻烦。使用open62541自带的定时器就会简单很多。下面来看下如何使用open62541提供定时功能。一 相关api首先要知道一些关于定时任务的简单知识,定时任务分为定时执行一次(也叫one shot)和定时循环执行(有个定时周期)2种...

2020-03-22 16:24:38 514

原创 学习open62541 --- [23] 使用View
原力计划

当地址空间中Node比较多时,在地址空间中去寻找需要的Node,就可能会比较慢,另外,地址空间中的Node可能大部分都不是我们需要的,我们只关心一部分Node,这个时候就可以使用View来简化操作。View可以从地址空间中抽出感兴趣的Node作为子集,然后每次在这个view下就可以访问我们感兴趣的Node了。另外,整个地址空间本身就是一个默认的View。下面就来看看如何使用View (整体代码...

2020-03-17 23:07:10 427

原创 Linux下计时函数clock_gettime()的时钟选择

Linux下计时函数有很多种,精度比较高的是clock_gettime(),其函数原型如下,#include <time.h>int clock_gettime(clockid_t clk_id, struct timespec *tp);struct timespec的定义如下,struct timespec { time_t tv_sec; /*...

2020-03-14 22:06:10 110

原创 学习open62541 --- [22] 再谈事件
原力计划

之前已经写了一篇文章简单讲述了事件的产生,本文继续探讨事件。一 事件基类型BaseEventType事件有很多种,每一种都有对应的类型,它们共同的基类型是BaseEventType,这个类型定义了一个事件所有的通用特性,它是一个Abstract类,不能直接实例化对象,只能被继承。BaseEventType的定义如下,这里只需BaseEventType使用HasProperty指向的变量...

2020-03-11 23:03:31 731 2

原创 学习open62541 --- [21] 使用用户名和密码登录
原力计划

在之前的系列文章中,OPC UA Client和OPC UA Server之间的连接都是使用的匿名,并没有使用用户名和密码,本文主要讲述如何关闭匿名登录,以及如何使用用户名和密码去连接Server。一 默认行为首先看下OPC UA Server的默认行为,下面是段典型的Server代码,#include "open62541.h"#include <signal.h>#i...

2020-03-08 15:29:15 1040 20

原创 学习open62541 --- [20] 标准Reference类型

在OPC UA Server中,所有Node之间都是使用Reference进行连接的。Reference是分类的,在之前的系列文章中,我们也已经见过几种Reference了,本文就专门讨论所有标准Rference类型。一 Reference的使用方式如果看过前面的系列文章,那么就会对Reference的使用方式有一定的理解,如下图,节点A通过一个Reference指向B,那么对于这个Re...

2020-02-29 14:01:03 520

原创 学习open62541 --- [19] 使用Visual Studio编译及使用open62541

本文主要讲述在Win10下如何使用Visual Studio来编译open62541,以及基于open62541去开发OPCUA程序。一 Visual Studio版本选择本人使用的是VS2015,之前使用的是VS2013,但是生成open62541工程时总是各种错误,不知咋回事,官方教程使用的是VS2015,于是又安装了VS2015,安装完VS2015时又遇到个坑,创建工程时没有Win...

2020-02-28 21:57:45 1892 9

原创 学习open62541 --- [18] Server与Server间交互

在之前的文章中,讲述的都是一个client和一个server,组合成一个C/S架构,但是在实际工程中,可能会出现多个OPC UA Server,如下图,展示的是OPC UA在IIOT中的应用,可以看出有的Server既充当Server也充当Client,只有这样才能让多个Server互联,最后形成一个大的OPC UA网络。对于这种情况,OPC UA文档已经描述了这种架构,先是简单的Serve...

2020-02-18 22:56:41 619 7

原创 学习open62541 --- [17] DisplayName和BrowseName的区别

本文主要讨论OPC UA中DisplayName和BrowseName的区别一 问题以变量为例,当我们添加变量时,在变量属性里会设置其DisplayName,接着调用UA_Server_addVariableNode()时会传递其BrowseName,典型代码如下,static void addVariable(UA_Server *server) { /* Define the...

2020-02-17 22:16:13 571

原创 学习open62541 --- [16] 修改默认端口

这篇比较简单。一 问题我们在使用open62541时,server启动时默认端口都是4840,下面是典型的server启动代码int main(void) { UA_Server *server = UA_Server_new(); UA_ServerConfig_setDefault(UA_Server_getConfig(server)); UA_Statu...

2020-02-06 14:12:57 606

原创 学习open62541 --- [15] 使用建模工具UaModeler

讲述如何使用建模工具UaModeler

2020-01-31 17:05:06 2034 14

原创 使用CMake交叉编译Arm Linux程序

我们平常使用CMake时,主要是在x86或x86_64平台上,其实CMake在2.6版本后就已经支持交叉编译了,下面就来看下如何使用CMake进行Arm Linux程序的交叉编译。一 建立工程按照如下结构体建立一个简单工程main.c内容如下,#include <stdio.h>int main(void){ printf("hello world\n");...

2020-01-30 14:20:40 1306 2

The GNU Make Book

关于GNU Make的一本好书 .个人看了官网的make教程,看的很晕,还是这本书容易

2016-08-04

空空如也

空空如也
提示
确定要删除当前文章?
取消 删除