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的更多相关文章

  1. C#数组,List,Dictionary的相互转换

    本篇文章会向大家实例讲述以下内容: 将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dicti ...

  2. ASP.NET Aries JSAPI 文档说明:AR.DataGrid、AR.Dictionary

    AR.Global 文档 1:对象或属性: 名称 类型 说明 DG 对象 DataGrid操作对象 //datagrid集合,根据ID取出DataGrid对象,将Json当数组用. Items: ne ...

  3. WebAPI接口返回ArrayList包含Dictionary对象正确解析

    一.问题提出 为了减少流量,将key-value(键值对)直接输出到Dictionary<string, string>,接口返回结果如下: 其中{}里面内容如下: 上图显示600是键,4 ...

  4. Linq在Array,List,Dictionary中的应用

    Linq在Array,List,Dictionary中的应用 今天在实际工作中需要对array,list,dictionary进行排序,试一试linq,发现非常好用,代码如下: using Syste ...

  5. python之最强王者(8)——字典(dictionary)

    1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...

  6. Swift3 - String 字符串、Array 数组、Dictionary 字典的使用

    Swift相关知识,本随笔为 字符串.数组.字典的简单使用,有理解.使用错误的地方望能指正. ///************************************************** ...

  7. [LeetCode] Alien Dictionary 另类字典

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  8. Dictionary

    命名空间:System.Collections.Generic(程序集:mscorlib) Dictionary<TKey, TValue> 类   一般用法:通过key获取value,k ...

  9. 关于 Dictionary<string,string>,和List<T>在View的使用

    在MVC中Dictionary<string,string>如何应用到View页面中呢,例: <input type="text" name=key value= ...

  10. Dictionary Learning(字典学习、稀疏表示以及其他)

    第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是稀疏字典学习(Sparse Di ...

随机推荐

  1. rust项目中通过log4rs将日志写入文件

    java项目中使用最广泛的日志系统应该是log4j(2)了.如果你也是一个Java程序员,可能在写rust的时候会想怎么能顺手地平移日志编写习惯到rust中来. log4rs就是干这个的.从名字就能看 ...

  2. Java 反射获取对象里的值

    最近在负责邮件服务,里面会涉及到很多Email模板,这里我使用到了java的模板引擎:jetbrick-template,需要使用Map集合一个个往里面设置值,然后调用模板方法,进行替换.实体类一个个 ...

  3. JavaSE 计算2个List集合中的交集、差集、并集、去重并集

    VideoOrder.java 重写里面的equals和hashCode方法 class VideoOrder { private int price; private String title; p ...

  4. Swift开发基础06-闭包

    Swift的闭包(Closures)是一种将功能块和上下文整合并演示在代码中的一种手段.闭包可以捕获并存储其上下文中的变量和常量.与普遍存在于其他语言的匿名函数(如Python的lambda.Java ...

  5. [BJDCTF2020]Mark loves cat(源码泄露+命令执行)

    扫描之后发现是/.git源码泄露 python GitHack.py http://56ad87c1-d8fb-463d-9480-f0fbee5176a0.node5.buuoj.cn:81/.gi ...

  6. [oeasy]python0069_帮助手册_pydoc_manual_document

    帮助手册 回忆上次内容   上次了解了注释 注释是为了让程序更可读 注释不会影响程序运行速度   注释分为两种 单行的 以#开头 不能是字符串当中的#   多行的 三个" 三个'     多 ...

  7. ComfyUI进阶:Comfyroll插件 (六)

    ComfyUI进阶:Comfyroll插件 (六) 前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业 ...

  8. Odoo 通过Javascript调用模型中自定义方法

    实践环境 Odoo 14.0-20221212 (Community Edition) 代码实现 在js脚本函数中调用模型中自定义方法: this._rpc({ model: 'demo.wizard ...

  9. NOIP2022退役记

    我是青岛西海岸新区的一名oier,qxyz(xhayz)的. (其实也不知道算不算得上真正的oier) 已经高二了,是最后一次noip了,必须写点什么记录一下了吧,这样至少可以向世界留下一点痕迹:这个 ...

  10. SSL/TLS 深入浅出

    SSL,https(HTTP over SSL), X.509, SSL 证书 ,证书申请 /导入/签发, 等名词,想必有一定工作经验的小伙伴,一定都会略有耳闻,或者至少也听神边大神念叨过.虽然司空见 ...