TwinCAT3 - 实现自己的Dictionary
1,前言
C#有字典,TwinCAT没字典,咋办,自己写一个咯
2,C#的字典
C#的字典使用很简单,下面是最基本的使用
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("key1", 1);
dic.Add("key2", "ABC");
dic["key1"] = 2;
var temp = dic["key1"];
dic.Remove("key1");
dic.Clear();
3,TwinCAT3的字典
就先实现第2节展示的几个基本功能吧。
定义功能块
- FB_Dictionary:对应Dictionary<string, object>
FUNCTION_BLOCK FB_Dictionary
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
// 键数组
keyArr : ARRAY[0..999] OF STRING;
// 值数组
dataArr : ARRAY[0..999] OF STRING(255);
// 值长度数组
lengthArr : ARRAY[0..999] OF UINT;
// 数组序号
ArrayIndex : INT;
END_VAR
本质上就是数组,C#的object就是一块内存,dataArr的每个元素是STRING(255),相当于一块长度为256byte的内存,lengthArr用来表示这块256byte的内存实际用了多少byte。
添加方法
- M_AddOrUpdate:对应Add和写入操作符[]
- M_Get:对应读取操作符[]
- M_Remove:对应Remove
- M_Clear:对应Clear
METHOD M_AddOrUpdate : BOOL
VAR_INPUT
key: STRING; //键
pData: PVOID; //值地址
DataLength: UINT; //值长度
END_VAR
VAR
i : INT;
tempstr : STRING(255); // 值
END_VAR
// 代码部分-----
IF ArrayIndex >= 999 THEN //防越界
RETURN;
END_IF
MEMCPY(ADR(tempstr), pData, MIN(DataLength, 255));
FOR i := 0 TO ArrayIndex - 1 BY 1 DO //相同的键
IF keyArr[i] = key THEN
dataArr[i] := tempstr;
lengthArr[i] := DataLength;
RETURN;
ELSIF LEN(keyArr[i]) <= 0 THEN
keyArr[i] := key;
dataArr[i] := tempstr;
lengthArr[i] := DataLength;
RETURN;
END_IF
END_FOR
keyArr[ArrayIndex] := key;
dataArr[ArrayIndex] := tempstr;
lengthArr[i] := DataLength;
ArrayIndex := ArrayIndex + 1; // 地址+1
METHOD M_Get : BOOL
VAR_INPUT
key: STRING; //键
pData: PVOID; //值地址
END_VAR
VAR
i: INT;
END_VAR
// 代码部分-----
IF ArrayIndex > 0 AND LEN(key) >= 1 THEN
// 遍历查找键值
FOR i := 0 TO ArrayIndex - 1 BY 1 DO
IF keyArr[i] = key THEN
MEMCPY(pData, ADR(dataArr[i]), lengthArr[i]);
M_Get:= TRUE;
RETURN;
END_IF
END_FOR
END_IF
METHOD M_Remove : BOOL
VAR_INPUT
key: STRING; //键
END_VAR
VAR
i : INT;
END_VAR
// 代码部分-----
FOR i := 0 TO ArrayIndex - 1 BY 1 DO //相同的键
IF keyArr[i] = key THEN
keyArr[i] := '';
dataArr[i] := '';
lengthArr[i] := 0;
M_Remove:= TRUE;
RETURN;
END_IF
END_FOR
METHOD M_Clear : BOOL
VAR_INPUT
END_VAR
// 代码部分-----
// 字典重置
ArrayIndex := 0;
MEMSET(ADR(keyArr), 0, SIZEOF(keyArr));
MEMSET(ADR(dataArr), 0, SIZEOF(dataArr));
MEMSET(ADR(lengthArr), 0, SIZEOF(lengthArr));
4,用起来
PROGRAM MAIN
VAR
A1: INT;
Dictionary: FB_Dictionary;
TempBool: BOOL;
key1 : STRING := 'int';
value1 : INT := 100;
value1_ : INT;
key2 : STRING := 'real';
value2 : REAL := 1.5;
value2_ : REAL;
key3 : STRING := 'string';
value3 : STRING := 'xxxx';
value3_ : STRING;
END_VAR
// 代码部分-----
//NICE!!
CASE A1 OF
0:
Dictionary.M_AddOrUpdate(key:= key1, pData:= ADR(value1), DataLength:= SIZEOF(value1));
Dictionary.M_AddOrUpdate(key:= key2, pData:= ADR(value2), DataLength:= SIZEOF(value2));
Dictionary.M_AddOrUpdate(key:= key3, pData:= ADR(value3), DataLength:= SIZEOF(value3));
1:
TempBool:= Dictionary.M_Get(key:= key1, pData:= ADR(value1_));
TempBool:= Dictionary.M_Get(key:= key2, pData:= ADR(value2_));
TempBool:= Dictionary.M_Get(key:= key3, pData:= ADR(value3_));
2:
TempBool:= Dictionary.M_Remove(key:= key1);
TempBool:= Dictionary.M_Remove(key:= key2);
3:
Dictionary.M_Clear();
END_CASE
TwinCAT3 - 实现自己的Dictionary的更多相关文章
- C#数组,List,Dictionary的相互转换
本篇文章会向大家实例讲述以下内容: 将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dicti ...
- ASP.NET Aries JSAPI 文档说明:AR.DataGrid、AR.Dictionary
AR.Global 文档 1:对象或属性: 名称 类型 说明 DG 对象 DataGrid操作对象 //datagrid集合,根据ID取出DataGrid对象,将Json当数组用. Items: ne ...
- WebAPI接口返回ArrayList包含Dictionary对象正确解析
一.问题提出 为了减少流量,将key-value(键值对)直接输出到Dictionary<string, string>,接口返回结果如下: 其中{}里面内容如下: 上图显示600是键,4 ...
- Linq在Array,List,Dictionary中的应用
Linq在Array,List,Dictionary中的应用 今天在实际工作中需要对array,list,dictionary进行排序,试一试linq,发现非常好用,代码如下: using Syste ...
- python之最强王者(8)——字典(dictionary)
1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...
- Swift3 - String 字符串、Array 数组、Dictionary 字典的使用
Swift相关知识,本随笔为 字符串.数组.字典的简单使用,有理解.使用错误的地方望能指正. ///************************************************** ...
- [LeetCode] Alien Dictionary 另类字典
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- Dictionary
命名空间:System.Collections.Generic(程序集:mscorlib) Dictionary<TKey, TValue> 类 一般用法:通过key获取value,k ...
- 关于 Dictionary<string,string>,和List<T>在View的使用
在MVC中Dictionary<string,string>如何应用到View页面中呢,例: <input type="text" name=key value= ...
- Dictionary Learning(字典学习、稀疏表示以及其他)
第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是稀疏字典学习(Sparse Di ...
随机推荐
- Android 中的property_get/property_set
Android 中的property_get/property_set 背景 在安卓中调试Linux驱动层以及应用层之间的一些功能时,需要获取一些属性. 参考: https://blog.csdn.n ...
- QT学习:08 QString
--- title: framework-cpp-qt-08-QString EntryName: framework-cpp-qt-08-QString date: 2020-04-16 15:36 ...
- 使用Github Action来辅助项目管理
Github action 是一个Github官方提供的非常流行且速度集成 持续集成和持续交付(CI/CD)的工具.它允许你在GitHub仓库中自动化.定制和执行你的软件开发工作流.你可以发现.创建和 ...
- Spring Reactor基本介绍和案例
1. Reactor 对比 1.1 Reactor 线程模型 Reactor 线程模型就是通过 单个线程 使用 Java NIO 包中的 Selector 的 select()方法,进行监听.当获取到 ...
- python3 webssh
简介 webssh 是 一个简单的 Web 应用程序,用作 ssh 客户端来连接到 ssh 服务器.它是用Python编写的,基于tornado.paramiko和xterm.js.下面简单搭建一个网 ...
- yb课堂 实战之Mybatis打通Mysql数据库 《二》
配置mybatis连接Mysql数据库 server.port=8081 # ========================数据库相关配置===================== spring.d ...
- 洛谷P1077
这道题和上一道题也是比较像的,基本采用的也是线性dp的思路 状态数组稍微有点不同,这里表示的是当前种数的花时一共的花的数量 #include<iostream> #include<u ...
- redis-sort by
对某个列表(list).集合(set).有序集合(zset)排序的时候按照某个 参考键 进行排序,而不是按照按照这个列表.集合或有序集合本身进行排序: 被排序的键和参考键在业务上有关联(这个由业务保证 ...
- 启动数据分析软件SPSS17遭遇的两弹窗解决方案
问题描述 朋友请我帮她安装 SPSS17 这款软件,我寻思这是啥软件,谷歌一下,发现是一个数据分析工具. 在一系列的下一步.确定后,打开时,第 1 个惊喜弹窗来了: [弹窗内容]应用程序无法启动,因为 ...
- 使用JavaScript编写vue指令v-model,v-model原理实现
首先先要知道的是v-model的作用是实现数据的双向绑定,即: 数据在视图层的双向响应. 实现思路主要分为两步: 第一步:数据层到视图层的响应 将数据响应到视图层的方式,在vue2使用的是Object ...