Compare commits

..

412 Commits

Author SHA1 Message Date
Kimdiego2098
1695f7cece 更新readme 2023-08-07 17:34:32 +08:00
Kimdiego2098
052c27f907 更新文件 2023-08-07 17:24:28 +08:00
Kimdiego2098
dc46c32b30 更新文件 2023-08-07 17:16:53 +08:00
Kimdiego2098
fa63349bb2 更新文件 2023-08-07 16:56:45 +08:00
Kimdiego2098
ffe26448a6 更新文件 2023-08-07 16:33:36 +08:00
Kimdiego2098
4af51e8a84 更新文件 2023-08-07 16:30:23 +08:00
Kimdiego2098
1e453cf5a5 更新文件 2023-08-07 15:46:30 +08:00
Kimdiego2098
591282b87d 更新文件 2023-08-07 15:36:49 +08:00
Kimdiego2098
e87528d520 去除多余解决方案配置 2023-08-07 15:31:22 +08:00
Kimdiego2098
d79eb0411d 添加发布脚本 2023-08-07 15:23:53 +08:00
Kimdiego2098
ac1e0a4cf7 更新readme 2023-08-07 15:18:42 +08:00
Kimdiego2098
9525eab130 更新readme 2023-08-07 15:13:21 +08:00
Kimdiego2098
89b317496c 更新文档 2023-08-07 15:10:42 +08:00
Kimdiego2098
13be91e78b 2.0.0 2023-08-07 15:09:53 +08:00
Kimdiego2098
f68c1437f3 调试更新Blazor代码时不再跳转登录界面 2023-07-25 22:00:27 +08:00
Kimdiego2098
4c64c969bb 取消不必要的错误日志 2023-07-25 20:50:33 +08:00
Kimdiego2098
b4bf3b5138 变量值更新错误提示; 2023-07-25 20:48:17 +08:00
Kimdiego2098
083bc4b400 优化大批量excel变量表导入效率 2023-07-25 18:26:48 +08:00
Kimdiego2098
e8683c5bcc 删除不必要延时 2023-07-25 16:52:56 +08:00
Kimdiego2098
80e0d1de91 发布1.7.6 2023-07-25 14:22:11 +08:00
Kimdiego2098
dbe841037e 优化导入excel效率 2023-07-25 14:21:17 +08:00
Kimdiego2098
bdd537c33c 添加上传插件获取采集设备属性值的快捷方法 2023-07-23 13:44:37 +08:00
Kimdiego2098
c0c3846094 Merge branch 'master' of https://gitee.com/dotnetchina/ThingsGateway 2023-07-23 09:59:11 +08:00
Kimdiego2098
9e8710e7d2 线程完成时不再需要全局数据移除,有可能会导致偶发全局数据丢失 2023-07-23 09:58:43 +08:00
Kimdiego2098
475553fdf6 线程完成时不要需要全局数据移除,有可能会导致偶发全局数据丢失 2023-07-23 09:57:03 +08:00
Kimdiego2098
9d570f5b45 更新icon包版本 2023-07-23 00:03:46 +08:00
Kimdiego2098
af7fafd34f 更新icon包版本 2023-07-22 23:59:03 +08:00
Kimdiego2098
d43130f4fc 修改插件日志为自定义日志 2023-07-22 23:34:09 +08:00
Kimdiego2098
7500194620 更新文档 2023-07-22 20:48:29 +08:00
Kimdiego2098
eb27c29144 发布1.7.4 2023-07-22 20:47:26 +08:00
Kimdiego2098
43260b3e24 修正错误名称 2023-07-22 20:32:34 +08:00
Kimdiego2098
f80713f0aa 添加上传插件最后错误原因 2023-07-22 20:10:45 +08:00
Kimdiego2098
0c4bdc7ad1 修复上传设备暂停按钮失效 2023-07-22 19:56:56 +08:00
Kimdiego2098
811cff7bd0 OPCUAServer 数组维度不再写any;rpc写入添加延时 2023-07-22 17:02:44 +08:00
Kimdiego2098
30269aa75c 更改假死检测间隔5分钟 2023-07-22 11:05:56 +08:00
Kimdiego2098
e345ef7083 添加OPCUAServer线程间隔配置项,优化最后一次错误提示 2023-07-22 11:03:56 +08:00
Kimdiego2098
f559c9b8f7 支持OPCUAServer数组类型,添加缓存文件存在判断 2023-07-21 21:28:39 +08:00
Kimdiego2098
f4af0916b2 去除OPCUA写入数组维度校验 2023-07-20 17:37:49 +08:00
Kimdiego2098
f15f14f28d 更新文档 2023-07-20 12:48:13 +08:00
Kimdiego2098
834f44f58d kafka尝试自动加载c库 2023-07-20 12:40:59 +08:00
Kimdiego2098
b36f45dcf4 修复中间变量Rpc写入 2023-07-20 10:55:37 +08:00
Kimdiego2098
11ba21c9a8 ModbusServer添加自定义循环间隔,修复中间变量写入 2023-07-20 10:55:17 +08:00
Kimdiego2098
b045557ce1 更新文档 2023-07-19 18:02:31 +08:00
Kimdiego2098
0dd251a3f6 更新文档 2023-07-19 15:43:28 +08:00
Kimdiego2098
793acb1725 更改左侧菜单为手风琴效果 2023-07-19 15:00:40 +08:00
Kimdiego2098
921243e8bd 更新文档 2023-07-19 14:34:27 +08:00
Kimdiego2098
bd9d7a90d9 修改OPCUAClient心跳频率默认3s 2023-07-18 14:49:27 +08:00
Kimdiego2098
cc444a4cea 更改OPCUAClient心跳频率为30000 2023-07-18 14:15:02 +08:00
Kimdiego2098
38ca1fa168 更新1.7.3版本 2023-07-18 12:16:33 +08:00
Kimdiego2098
7a552b87ec 更新masa 稳定版以及其他包 2023-07-18 12:11:37 +08:00
Kimdiego2098
36923d3190 修复添加订阅时,值死区过滤逻辑 2023-07-18 11:13:21 +08:00
Kimdiego2098
a9d3017123 修复异步锁上下文切换导致OPCUA 心跳事件出错 2023-07-18 09:58:01 +08:00
Kimdiego2098
313acd4976 修复OPCUAClient调试界面重复输出订阅值 2023-07-18 08:51:27 +08:00
Kimdiego2098
a4c91bb268 修改OPCUAClient的心跳频率配置项 2023-07-18 08:48:18 +08:00
Kimdiego2098
f9b566984b 添加重启锁 2023-07-17 21:40:47 +08:00
2248356998 qq.com
8dd261854d Merge branch 'master' of https://gitee.com/diego2098/thingsgateway-docs 2023-07-17 20:59:53 +08:00
2248356998 qq.com
7351e62d87 更新opcua心跳状态日志 2023-07-17 20:59:32 +08:00
Diego2098
0593ae720b 更新文档 2023-07-16 20:46:16 +08:00
Diego2098
a0a7b08e08 更新授权名单 2023-07-16 20:31:56 +08:00
2248356998 qq.com
9a3bc6b8b3 更新文档 2023-07-16 18:27:22 +08:00
2248356998 qq.com
5acae17f71 更新文档 2023-07-16 18:12:55 +08:00
2248356998 qq.com
f1e5b76ef2 更新文档 2023-07-16 18:07:31 +08:00
2248356998 qq.com
53c628fde9 更新文档 2023-07-16 17:49:33 +08:00
2248356998 qq.com
baca0a70c0 更新文档 2023-07-16 17:48:22 +08:00
2248356998 qq.com
3e8d0af404 更新文档 2023-07-16 17:41:52 +08:00
2248356998 qq.com
cf9a91d9d5 更新文档 2023-07-16 17:35:04 +08:00
2248356998 qq.com
02b9e282c6 更新文档地址 2023-07-16 17:32:49 +08:00
2248356998 qq.com
9ce87f235f 迁移文档 2023-07-16 17:28:26 +08:00
2248356998 qq.com
e329bea1b2 冗余设备删除后会导致后台出错 2023-07-16 11:36:45 +08:00
2248356998 qq.com
8086e7b54d 更新readme 2023-07-16 10:28:43 +08:00
2248356998 qq.com
f7a875606e 删除无用属性 2023-07-16 09:40:00 +08:00
2248356998 qq.com
196eaf85f4 修复1.7.0版本修改导致的mqttrpc映射错误 2023-07-15 22:56:28 +08:00
2248356998 qq.com
876a55668e 增加 上传插件的列表分割大小,因为某些情况下传输字节太大会导致失败 2023-07-15 22:42:34 +08:00
2248356998 qq.com
05bd21bdd5 导入提示的当前行显示未初始 2023-07-15 22:35:12 +08:00
2248356998 qq.com
fb51a08cc6 格式化整理 2023-07-15 22:32:54 +08:00
2248356998 qq.com
dd83d7f4d3 插件报文截取前200字符,防止页面渲染过多 2023-07-15 20:04:14 +08:00
2248356998 qq.com
842a56f7ce kafka插件增加超时选项 2023-07-15 17:27:35 +08:00
2248356998 qq.com
9246a6e797 历史服务修复变量在线状态显示错误 2023-07-15 15:46:39 +08:00
2248356998 qq.com
8ad693f717 发布1.7.2版本 2023-07-15 11:10:29 +08:00
2248356998 qq.com
f4c2ee7cc4 优化OPCUA错误提示 2023-07-14 17:33:11 +08:00
2248356998 qq.com
6043441faa OPCUA在取消订阅时应该走读取方法 2023-07-14 17:22:19 +08:00
2248356998 qq.com
4a065c3710 优化导入excel提示 2023-07-14 16:23:42 +08:00
2248356998 qq.com
0ef800bdd7 优化导入excel提示 2023-07-14 16:23:35 +08:00
2248356998 qq.com
56eaa1910d kafka 插件释放时取消事件注册 2023-07-14 14:35:40 +08:00
2248356998 qq.com
201788e286 更改属性说明 2023-07-14 12:23:46 +08:00
2248356998 qq.com
506e0f144f 添加kafka插件null传播 2023-07-14 10:41:04 +08:00
2248356998 qq.com
72f68bfdd9 opcda JValue转object 2023-07-14 10:14:05 +08:00
2248356998 qq.com
2f9869b11d opcua读取值JValue转为object 2023-07-14 10:04:05 +08:00
2248356998 qq.com
8ffcf6498c RabbitMQ,IotSharp添加离线缓存 2023-07-13 19:54:12 +08:00
2248356998 qq.com
d224ae1923 Variable Value数据类型改为object 2023-07-13 18:18:53 +08:00
2248356998 qq.com
fed2063a19 中间变量页种子ID重复 2023-07-13 17:47:22 +08:00
2248356998 qq.com
db2810cdd7 复制设备没有及时刷新缓存 2023-07-13 17:38:45 +08:00
2248356998 qq.com
4f1a6781ef 发布1.7.1 2023-07-13 11:19:17 +08:00
2248356998 qq.com
beffa5d5a4 代码格式化 2023-07-13 11:18:36 +08:00
2248356998 qq.com
7a20f1de07 OPCDA增加数组支持,增加写入动态类型支持 2023-07-13 11:16:31 +08:00
2248356998 qq.com
cd25cf726b 优化OPCUA数组类型转换 2023-07-13 09:02:36 +08:00
2248356998 qq.com
d6b1bc3842 修复blazor界面null错误 2023-07-12 22:12:11 +08:00
2248356998 qq.com
a4385fb9bb 更新ReadMe 2023-07-12 21:33:05 +08:00
2248356998 qq.com
7045f2b8ea 删除重复文件 2023-07-12 21:30:41 +08:00
2248356998 qq.com
07ca1a4de8 更新nuget包 2023-07-12 21:21:50 +08:00
2248356998 qq.com
24f289e692 V1.7.0发布
1、增加采集通道冗余
2、优化多个界面
3、导出导入功能优化
4、增加中间变量
5、OPCUAClient支持动态类型
6、离线缓存多处覆盖,包含上传插件/历史报警/时序库
7、增加通用调试界面,增加s7调试
8、其他优化
2023-07-12 21:16:38 +08:00
2248356998 qq.com
01bcdaae2d 修复AppDataTable清空MForm模型导致筛选列清空的问题 2023-07-10 13:18:14 +08:00
2248356998 qq.com
55890008d1 修复写入s7协议 bit值 偏移错误(以byte数据块为准) 2023-07-08 17:01:44 +08:00
2248356998 qq.com
5ab9b01879 修复读取s7协议 bit值 偏移错误(以byte数据块为准) 2023-07-08 11:44:57 +08:00
2248356998 qq.com
e4abb333b3 默认添加kafka插件 种子数据 2023-07-07 17:13:00 +08:00
2248356998 qq.com
09f476c745 修复布尔量解析时反转字节导致结果值不符的错误 2023-07-06 14:05:09 +08:00
2248356998 qq.com
8806e68dce null传播 2023-07-03 14:13:00 +08:00
2248356998 qq.com
2ef1e25cd8 添加x86架构 2023-07-03 10:48:52 +08:00
2248356998 qq.com
10e7f202aa 补充插件实例内容 2023-07-02 19:50:09 +08:00
2248356998 qq.com
ccd7000c09 blazor组件初始化并行执行,导致sugar单例DB出现线程偶发错误,暂增加copyNew()解决 2023-06-29 16:42:19 +08:00
2248356998 qq.com
8ee7b798cf blazor组件初始化并行执行,导致sugar单例DB出现线程偶发错误,暂增加copyNew()解决 2023-06-29 16:36:03 +08:00
2248356998 qq.com
7733cf5bf0 sqlsugar偶发线程故障,添加copyNew方法 2023-06-28 18:54:45 +08:00
2248356998 qq.com
a05ce86dd7 登录跳转uri优化 2023-06-28 15:47:35 +08:00
2248356998 qq.com
91f51c32e8 更新开源说明 2023-06-28 10:48:33 +08:00
2248356998 qq.com
f910202bba update openapiUser datatableUI 2023-06-26 19:51:02 +08:00
2248356998 qq.com
6d77194a8f css脚本结果不采用 System.Text.Json.JsonSerializer 2023-06-26 19:44:17 +08:00
2248356998 qq.com
9deb89c15f OPCUAClient修复当变量为string类型时的数值过滤失败导致添加订阅失效 2023-06-26 19:43:00 +08:00
2248356998 qq.com
4b62a092b4 停用采集设备时,变量获取运行态出错 2023-06-26 16:43:48 +08:00
2248356998 qq.com
81c8f626f9 登录后跳转原url 2023-06-26 14:46:24 +08:00
2248356998 qq.com
3e846c42fb cookie授权验证失败时返回登录界面 2023-06-26 14:36:41 +08:00
Diego2098
63ad7fd766 更新nuget类库 2023-06-25 18:59:09 +08:00
2248356998 qq.com
9ff1e9aa34 添加报警事件None枚举 2023-06-20 13:10:58 +08:00
2248356998 qq.com
8d162b6f3d 修复cpu核心等于1时报错,修正登录错误提示 2023-06-20 09:09:08 +08:00
Diego2098
9844d10bef 修复modbusServer 初始化错误 2023-06-17 18:14:13 +08:00
2248356998 qq.com
b908fa8489 sugar添加取消令箭 2023-06-15 17:38:36 +08:00
2248356998 qq.com
15a10643a7 增加变量运行态 CollectVariableRuntime 所在设备属性 2023-06-15 16:50:08 +08:00
2248356998 qq.com
299617aca1 parallel.foreach无序体验不好,退回为foreach 2023-06-14 11:04:09 +08:00
2248356998 qq.com
45647d697a update 1.6.1 version 2023-06-13 22:39:47 +08:00
2248356998 qq.com
48f5105d38 update nuget package 2023-06-13 22:39:25 +08:00
2248356998 qq.com
fe1c741d68 update driver messagesui 2023-06-13 22:26:19 +08:00
2248356998 qq.com
fa42cc1f00 并行关闭线程 2023-06-12 14:41:08 +08:00
2248356998 qq.com
42cf5e7a81 添加mqtt/kafka上传内容显示 2023-06-12 14:40:53 +08:00
2248356998 qq.com
47905e1aa1 优化大量变量excel上传的验证过程 2023-06-12 11:35:27 +08:00
2248356998 qq.com
9a8e907df3 更新文档站点地址 2023-06-11 18:37:50 +08:00
2248356998 qq.com
106fe85582 删除docs 2023-06-11 18:22:15 +08:00
2248356998 qq.com
4b3571bd57 更新1.6.0版本 2023-06-11 17:58:57 +08:00
2248356998 qq.com
96b537401a 缓存最大默认2000 2023-06-11 17:56:34 +08:00
2248356998 qq.com
721c9eb057 添加离线缓存大小限制配置 2023-06-11 17:55:03 +08:00
2248356998 qq.com
51701bf6d6 上传插件线程等待时间改为10ms 2023-06-11 17:47:16 +08:00
2248356998 qq.com
dbde68bd56 导入变量优化 2023-06-11 17:46:23 +08:00
2248356998 qq.com
ad2c9f585a 添加mqttClient离线缓存 2023-06-11 17:45:46 +08:00
2248356998 qq.com
562093c468 添加kafka离线缓存 2023-06-11 17:45:27 +08:00
Diego2098
b0295584a3 !6 部分配置会导致SqlServer自动建库失败
Merge pull request !6 from samisgod/master
2023-06-10 06:55:34 +00:00
samisgod
208c54de98 fix db init for SqlServer 2023-06-10 14:51:29 +08:00
2248356998 qq.com
63e2d941a1 增加pwa 2023-06-09 17:53:41 +08:00
2248356998 qq.com
3956838e9c 修复停用验证码时登录失败显示null报错 2023-06-09 17:09:17 +08:00
2248356998 qq.com
abeee58bb0 统一文件编码 2023-06-09 15:04:54 +08:00
2248356998 qq.com
d5b1b49722 update solution folder 2023-06-09 14:30:53 +08:00
2248356998 qq.com
564ed03ff8 upload deviceStatusPage 2023-06-09 10:32:11 +08:00
2248356998 qq.com
70db4c76b4 update deviceStatusPage 2023-06-09 09:49:03 +08:00
2248356998 qq.com
d059f7975b remove dotNET China declaration 2023-06-09 09:10:30 +08:00
2248356998 qq.com
4e74e6dc2d add dotNET China declaration 2023-06-09 09:02:17 +08:00
Diego2098
b6deb96658 重启线程时增加运行状态界面空传播防止报错 2023-06-08 21:35:07 +08:00
2248356998 qq.com
3839e966be add upload plugin code description 2023-06-08 17:47:53 +08:00
2248356998 qq.com
3dd035849c 迁移导入变量功能到驱动调试内 2023-06-08 15:11:58 +08:00
2248356998 qq.com
3d6532b5d6 plugin unload test,but failed 2023-06-08 10:52:39 +08:00
2248356998 qq.com
bf7c175ee7 更改默认api文档为Knife4j 2023-06-07 20:34:31 +08:00
2248356998 qq.com
f84af35ed6 缓存键增加Type-TypeHandle句柄 2023-06-07 18:42:58 +08:00
2248356998 qq.com
99063b3eb1 修改OPCUA证书路径,增加默认接收不收信任证书与其选项;
OPCDA整理;
2023-06-07 18:03:57 +08:00
2248356998 qq.com
3bec18f28d 重启线程WebApi修改 2023-06-07 11:32:18 +08:00
2248356998 qq.com
15de7a7894 添加注释提示 2023-06-07 11:28:11 +08:00
2248356998 qq.com
e20e04e677 GC策略更改,大量变量实例手动清空以快速内存释放 2023-06-07 11:19:24 +08:00
2248356998 qq.com
5fc6ae2835 上传1.5.1 2023-06-06 19:37:04 +08:00
2248356998 qq.com
7d281b8c96 Merge branch 'master' of https://gitee.com/diego2098/ThingsGateway 2023-06-05 08:33:50 +08:00
Diego2098
4880b801a7 S7-TCP连接修复死锁 2023-06-02 22:20:21 +08:00
2248356998 qq.com
74e354456a 增加KINGVIEW 配置 2023-05-29 01:32:37 +08:00
2248356998 qq.com
af2e03aa36 超管用户名称不可更改 2023-05-26 00:14:05 +08:00
2248356998 qq.com
d8fa660ab6 初步添加OPCUAClient调试界面;更新依赖 2023-05-25 23:41:11 +08:00
2248356998 qq.com
1a62d48297 OPCUA安全策略添加全部选项 2023-05-25 00:59:21 +08:00
2248356998 qq.com
7ba01be13d OPCUA安全策略添加全部选项 2023-05-25 00:58:47 +08:00
2248356998 qq.com
1a83d64db7 添加OPCDAClient调试页面 2023-05-25 00:11:00 +08:00
2248356998 qq.com
5b53014c40 修改程序根目录为文件所在目录 2023-05-24 14:37:45 +08:00
2248356998 qq.com
83685340af 默认添加服务守护支持 2023-05-24 14:32:21 +08:00
2248356998 qq.com
31e0cc4dec ModbusServer添加自定义数据类型;修复发布时静态文件路径错误 2023-05-24 12:31:20 +08:00
2248356998 qq.com
56b87fc1f5 Add copyright notices 2023-05-23 23:54:28 +08:00
2248356998 qq.com
6b956a2dd7 update TGTcpClient 2023-05-23 22:42:48 +08:00
2248356998 qq.com
1937623d7d 添加Modbus系列插件调试页面;添加Modbus组包解析缓存超时时间; 2023-05-23 20:50:44 +08:00
2248356998 qq.com
3b60b10945 update HardwareInfoService 2023-05-23 12:04:04 +08:00
2248356998 qq.com
7173acd350 nuget更新 2023-05-23 11:59:28 +08:00
2248356998 qq.com
6310d87338 硬件界面添加限值防报错 2023-05-23 11:46:19 +08:00
2248356998 qq.com
49a1ed7c18 初步添加插件驱动调试页面 2023-05-22 18:50:30 +08:00
2248356998 qq.com
d426e280d9 初步添加插件驱动调试页面 2023-05-22 18:41:09 +08:00
2248356998 qq.com
6154fb29f1 Razor文件格式化清理 2023-05-22 18:40:50 +08:00
2248356998 qq.com
97d48ef9d6 删除调试代码... 2023-05-22 17:09:21 +08:00
2248356998 qq.com
88992625c4 更改变量读取间隔限制最低为10ms 2023-05-22 15:17:22 +08:00
2248356998 qq.com
bc6eb44218 明确System.Management版本 2023-05-22 14:51:02 +08:00
2248356998 qq.com
cf9ccd799d 硬件信息获取添加异常拦截 2023-05-22 14:33:30 +08:00
2248356998 qq.com
ffa0e4e771 update adapter 2023-05-22 12:42:31 +08:00
2248356998 qq.com
60fa9c196c 代码清理 2023-05-21 22:39:33 +08:00
2248356998 qq.com
df860d22fb 优化opcua质量戳提示;添加数据转换基础方法;TCP等待返回时默认断开连接立即返回 2023-05-21 10:51:56 +08:00
2248356998 qq.com
cb46ff326c modbus 组包优化 2023-05-20 21:41:16 +08:00
2248356998 qq.com
f277a853ef 类型更换 2023-05-20 17:13:14 +08:00
2248356998 qq.com
9ae34f67c3 可指定OPCUA节点数据类型 2023-05-20 15:40:17 +08:00
2248356998 qq.com
c9223218cc 更新文档 2023-05-20 13:52:23 +08:00
2248356998 qq.com
c0dd645aba 添加自定义OPCUAServer数据类型 2023-05-20 12:34:06 +08:00
2248356998 qq.com
2e948eb5b6 导入规则优化,主动抛出名称重复错误 2023-05-19 22:55:53 +08:00
2248356998 qq.com
c3276889cf 更改插件时开启刷新设备属性 2023-05-19 22:26:37 +08:00
2248356998 qq.com
a76ca8282d 判断OPCUAServer状态时增加tryCatch 2023-05-19 21:27:20 +08:00
2248356998 qq.com
8ce6b8362f 判断OPCUAServer状态时增加tryCatch 2023-05-19 21:24:56 +08:00
2248356998 qq.com
842fb12f05 优化tcp拆包组包 2023-05-19 20:28:51 +08:00
2248356998 qq.com
d63e1511af 快捷方式null错误 2023-05-19 16:33:57 +08:00
2248356998 qq.com
278783b8e0 更新依赖包 2023-05-19 16:23:21 +08:00
2248356998 qq.com
d24e3c922d UDP通讯优化 2023-05-19 16:21:42 +08:00
2248356998 qq.com
1d02cd2283 添加链路锁 2023-05-19 14:27:47 +08:00
2248356998 qq.com
8edeb82a87 分包数量显示错误 2023-05-19 10:13:48 +08:00
2248356998 qq.com
146e9279de Modbus读写锁更新 2023-05-19 10:05:54 +08:00
2248356998 qq.com
47105f50a9 Modbus读写锁更新 2023-05-19 09:53:56 +08:00
2248356998 qq.com
16c9c80f37 删除sqlsugar旧版本代码,会导致sqlite不兼容 2023-05-19 09:15:32 +08:00
2248356998 qq.com
8e7e4bc95a 适配mysql;修复写入表达式转换;优化web页面写入体验 2023-05-18 23:38:40 +08:00
2248356998 qq.com
0aa3d2f930 数据库初始化修复 2023-05-18 22:24:27 +08:00
2248356998 qq.com
ce77755a1e 数据库连接自动释放 2023-05-18 21:06:06 +08:00
2248356998 qq.com
0f31f20c87 编辑页面添加 变量 允许远程写入选项 2023-05-18 21:03:44 +08:00
2248356998 qq.com
ee6da2aaa5 修复枚举类型在mysql中类型出错的问题 2023-05-18 20:58:14 +08:00
Diego2098
a35f087cd9 修改文件大小限制 2023-05-17 22:29:59 +08:00
Diego2098
6e029b44dd 更新设备读写锁 2023-05-17 22:05:31 +08:00
2248356998 qq.com
973c0cff34 touchSocket修复UDP在windows下重置连接的问题;更新nuget 2023-05-17 16:54:33 +08:00
2248356998 qq.com
2027eea6ac 代码格式清理 2023-05-17 16:49:25 +08:00
2248356998 qq.com
2f43692f33 修复CancellationTokenSource未释放导致Linux下偶发内存问题 2023-05-17 16:44:52 +08:00
2248356998 qq.com
6d24992f88 OPCUAServer节点数据类型增加在读取表达式转换后的判断 2023-05-16 09:05:58 +08:00
Diego2098
b4388a58d6 ModbusClient添加帧前时间 2023-05-15 22:45:55 +08:00
2248356998 qq.com
158aa05fac 修复using作用域导致获取的服务可能被释放的问题 2023-05-15 19:21:35 +08:00
2248356998 qq.com
f2731bf55e nuget更新 2023-05-15 18:55:27 +08:00
2248356998 qq.com
7304e99fce mqttClient同步间隔上传的实体类 2023-05-12 18:22:06 +08:00
2248356998 qq.com
02700b83eb update mqttClient 2023-05-12 16:40:55 +08:00
2248356998 qq.com
676b25acf9 MqttClient增加间隔上传选项;更改线程循环间隔说明定义 2023-05-12 16:31:57 +08:00
Diego2098
556359ea2d update readme 2023-05-10 21:18:43 +08:00
Diego2098
b72923e0f5 增加api控制采集启停等方法 2023-05-10 21:17:34 +08:00
Diego2098
115ac9f75e 提交kafka插件 2023-05-10 21:17:09 +08:00
2248356998 qq.com
32e36f6708 update readme 2023-05-10 17:49:52 +08:00
2248356998 qq.com
d949b7a4f9 共享链路写入变量修复;Nuget更新 2023-05-10 16:33:59 +08:00
2248356998 qq.com
eae1171ff5 更新文档 2023-05-09 17:51:55 +08:00
2248356998 qq.com
76a1b75a51 更新文档 2023-05-09 17:47:22 +08:00
2248356998 qq.com
8882c0daea OPCUAClient/Server 修改证书有效期为100年 2023-05-09 14:37:18 +08:00
2248356998 qq.com
07ebc16d59 添加控制台logo 2023-05-08 18:10:07 +08:00
2248356998 qq.com
0ceb109964 Code Cleanup 2023-05-08 18:03:32 +08:00
2248356998 qq.com
118b0d0038 add GetSciptValue 2023-05-08 17:45:13 +08:00
2248356998 qq.com
5e87067792 modbus rtu 粘包优化 2023-05-08 15:59:35 +08:00
2248356998 qq.com
c946a252e8 modbus rtu报文粘包优化;共享链路切换延时;上传插件添加报文界面 2023-05-08 15:57:33 +08:00
2248356998 qq.com
f9ad2ba1dd plc read with CancellationToken 2023-05-08 13:33:01 +08:00
2248356998 qq.com
0d0ecd33bd 粘包优化 2023-05-08 10:55:16 +08:00
2248356998 qq.com
e4b98fd05b Rpc条件bug修复 2023-05-07 18:06:27 +08:00
2248356998 qq.com
95a5933303 OPCUAServer修复匿名登录 2023-05-07 18:06:09 +08:00
2248356998 qq.com
da3b55fa64 更新文档 2023-05-07 16:56:41 +08:00
2248356998 qq.com
fbbabfb90e 属性顺序调整 2023-05-05 09:46:11 +08:00
2248356998 qq.com
f13da6830d 更新文档 2023-05-04 22:58:36 +08:00
2248356998 qq.com
f560a8e2f8 update CollectDeviceThread 2023-05-04 10:58:45 +08:00
2248356998 qq.com
56f1139c2f 更新文档 2023-05-02 22:11:55 +08:00
2248356998 qq.com
773bdfc1e2 更新1.5.0 2023-05-02 22:06:09 +08:00
2248356998 qq.com
f449666628 1、共享链路支持;
2、设备报文查看;
3、采集线程重构;
2023-05-02 21:58:11 +08:00
2248356998 qq.com
3f282de0ab mqtt重连锁优化 2023-04-27 11:19:32 +08:00
2248356998 qq.com
440dd8d22f 添加常用转换 2023-04-24 17:54:00 +08:00
2248356998 qq.com
dcff9de2f7 masa更新 2023-04-24 11:16:28 +08:00
2248356998 qq.com
a192866543 更新包 2023-04-24 09:26:47 +08:00
Diego2098
10081416de 报警后台服务去除多余接口
Signed-off-by: Diego2098 <2248356998@qq.com>
2023-04-19 00:48:13 +00:00
2248356998 qq.com
e2bed618f9 添加docker文件 2023-04-17 17:39:12 +08:00
2248356998 qq.com
03ab1f3823 单文件发布 2023-04-17 15:13:40 +08:00
2248356998 qq.com
ac8aeb63d9 update SqlSugarConfig 2023-04-17 11:58:41 +08:00
2248356998 qq.com
2e16d822fa 删除其他信息 2023-04-17 11:05:38 +08:00
2248356998 qq.com
e407d873fa 验证码更新修复 2023-04-17 09:05:44 +08:00
2248356998 qq.com
fd712a1dbe 1、字段null约束修改
2、ModbusServer绑定端口优化
2023-04-16 15:02:09 +08:00
2248356998 qq.com
e9028b40ce 更新readme 2023-04-16 13:34:29 +08:00
2248356998 qq.com
c9da3dee7c 更新1.4.0
注意Excel导入已不适用以前版本
1、去除动态更新插件
2、改用MiniExcel,支持动态导入,excel配置更简单
3、优化多处界面与后台逻辑,部分方法规范更名
4、修复外网地址获取错误等
2023-04-15 20:48:56 +08:00
2248356998 qq.com
c8c224e202 修复报警文本逻辑 2023-04-11 13:40:13 +08:00
2248356998 qq.com
f34559daaf 1,修复控制台报错(echarts.js问题,已删除)2,多处Dispose修正 2023-04-07 08:48:34 +08:00
2248356998 qq.com
9fefbf4c27 过滤 2023-04-06 14:46:24 +08:00
2248356998 qq.com
1af9fd73ea 历史数据库选择为sqlite时查询转换日期错误 2023-04-05 18:04:33 +08:00
2248356998 qq.com
75ef394eff 启用开发环境web详细日志,调整App.Razor位置,添加网页ico 2023-04-05 17:14:26 +08:00
2248356998 qq.com
ec6cc2c63e update console/file datetime format 2023-04-05 15:49:00 +08:00
2248356998 qq.com
06bc2e192b 更新readme 2023-04-04 18:41:56 +08:00
2248356998 qq.com
78701ec7c1 😀版本1.3.1 2023-04-04 17:55:52 +08:00
2248356998 qq.com
c925fab7e4 网关软件时间统一UTC 2023-04-04 17:55:15 +08:00
2248356998 qq.com
42fd72c164 update iotSharpClient 2023-04-04 11:07:05 +08:00
2248356998 qq.com
7fd160e1a2 😀 更新1.3.0 2023-04-04 10:15:34 +08:00
2248356998 qq.com
97a0d940eb update iotSharpClient 2023-04-04 09:25:16 +08:00
2248356998 qq.com
efaa099d81 update iotSharpClient 2023-04-04 09:23:22 +08:00
2248356998 qq.com
47864a804b IosSharpClient Rpc优化 2023-04-04 09:22:22 +08:00
2248356998 qq.com
91136c0e43 IotSharp Rpc方法完善 2023-04-04 09:19:48 +08:00
2248356998 qq.com
28c3b1bd61 添加写入多个变量的api方法 2023-04-04 09:18:58 +08:00
2248356998 qq.com
551352bc40 update IotSharpClient 2023-04-03 20:16:38 +08:00
2248356998 qq.com
e73c24c925 更新种子 2023-04-03 19:34:12 +08:00
2248356998 qq.com
7ec4c286cc 添加IotSharp插件 2023-04-03 19:30:52 +08:00
2248356998 qq.com
6705e2ec4b 分页显示令牌 2023-04-03 15:29:35 +08:00
2248356998 qq.com
6f0373063b 后台启动时Furion RootServices NULL值 2023-04-03 15:19:59 +08:00
2248356998 qq.com
f64eef60b5 修复不存在采集设备时,初始化报警/历史服务bug 2023-04-03 14:12:56 +08:00
2248356998 qq.com
89546bf86b 弹窗消息在SignalR订阅方法中需InvokeAsync 2023-04-03 13:35:14 +08:00
2248356998 qq.com
793678feca 修复规范化结果包装2次导致登录返回结果不正确的问题 2023-04-03 12:45:19 +08:00
2248356998 qq.com
923cc3019a 更新演示地址 2023-04-03 10:47:49 +08:00
2248356998 qq.com
10eb98a5f6 readme 2023-04-02 18:12:18 +08:00
2248356998 qq.com
bd9e89d8dd readme 2023-04-02 18:08:56 +08:00
2248356998 qq.com
1926b4ce73 更新readme 2023-04-02 18:05:54 +08:00
2248356998 qq.com
4ef3062d74 更新readme 2023-04-02 18:05:28 +08:00
2248356998 qq.com
abb6e0f60f 更新包 2023-04-02 17:10:32 +08:00
2248356998 qq.com
f204d8d84e 添加注释 2023-04-02 16:59:46 +08:00
2248356998 qq.com
fa301656f1 调整依赖,添加关系图 2023-04-01 17:28:35 +08:00
2248356998 qq.com
7e1221028f 调整依赖,更新版本1.2.1 2023-04-01 15:45:02 +08:00
2248356998 qq.com
41308cb2dd 整理 2023-04-01 13:57:57 +08:00
2248356998 qq.com
130600521c 😀 OPCUAServer支持历史查询数据 2023-03-31 18:32:55 +08:00
2248356998 qq.com
cd57548a48 添加ThingsGateway.Foundation注释 2023-03-31 16:25:33 +08:00
2248356998 qq.com
efacc99f76 硬件信息获取添加延时 2023-03-30 20:51:08 +08:00
2248356998 qq.com
f0d236e172 脚本显示优化 2023-03-30 19:51:38 +08:00
2248356998 qq.com
a8118bd8c6 更新文档 2023-03-30 19:39:35 +08:00
2248356998 qq.com
0e58f2ef53 mqtt/mq上传 添加上传实体自定义脚本 2023-03-30 19:07:18 +08:00
2248356998 qq.com
f4b22b3a0c 表达式整理 2023-03-30 16:23:03 +08:00
2248356998 qq.com
df5bd281c7 更新版本 2023-03-30 14:12:39 +08:00
2248356998 qq.com
a3f23837ce 更新文档 2023-03-30 14:11:16 +08:00
2248356998 qq.com
612d989b97 readme 2023-03-30 14:06:03 +08:00
2248356998 qq.com
42c01ee9a2 更新readme,nuget 2023-03-30 14:05:00 +08:00
2248356998 qq.com
14074db591 删除多余代码 2023-03-30 13:53:57 +08:00
2248356998 qq.com
43dfdd7942 opcua 写入添加用户名日志 2023-03-30 13:32:32 +08:00
2248356998 qq.com
f397b97ccf 去除ua数据类型验证 2023-03-30 13:20:26 +08:00
2248356998 qq.com
95f8716144 更新readme 2023-03-30 13:13:44 +08:00
2248356998 qq.com
17ba472b2e 类命名错误更改 2023-03-30 13:11:46 +08:00
2248356998 qq.com
42d82571ab 发布文件添加 2023-03-30 13:11:43 +08:00
2248356998 qq.com
9119a28141 添加OPCUAServer插件,修复个别bug 2023-03-30 13:10:31 +08:00
Diego2098
a32263d838 1、OPCUAClient修复客户端证书未自动生成
2、修复异步方法错误使用
2023-03-30 00:15:13 +08:00
2248356998 qq.com
208ae2bb88 添加部分代码注释 2023-03-29 16:22:01 +08:00
2248356998 qq.com
4d85462a85 驱动支持主机名称 2023-03-29 11:07:21 +08:00
2248356998 qq.com
f601aa9ca0 修复初始化失败导致的一系列问题 2023-03-29 10:53:42 +08:00
2248356998 qq.com
8aee3ad455 上传插件间隔时间修正 2023-03-28 16:40:00 +08:00
2248356998 qq.com
6a2a1e9561 历史变量enable失效 2023-03-28 16:38:29 +08:00
2248356998 qq.com
5f8786c9dc 历史报表时间格式改为yyyy-MM-dd HH:mm:ss ffffff 2023-03-28 16:31:53 +08:00
2248356998 qq.com
73f1d3eead 采集设备状态判断错误 2023-03-28 16:21:30 +08:00
2248356998 qq.com
2bf21bb3c3 采集设备状态判断错误 2023-03-28 15:55:01 +08:00
2248356998 qq.com
f80f0dbb11 修复历史保存值 频繁时出现值相同的问题 2023-03-28 15:14:30 +08:00
2248356998 qq.com
37518c70c4 opc 活动时间修正 2023-03-28 14:15:14 +08:00
2248356998 qq.com
e5951b5bef 添加写入采集时间的接口,而不是固定DateTime.Now 2023-03-28 14:03:11 +08:00
2248356998 qq.com
ab320bd90b 更新tcpclient 2023-03-28 13:52:33 +08:00
2248356998 qq.com
7bd36b5371 修复linux 分隔符错误问题 2023-03-28 11:48:16 +08:00
2248356998 qq.com
b882b0f2bc 更改插件文件不存在时的日志信息 2023-03-28 10:21:39 +08:00
2248356998 qq.com
38d7ae73cc 更改项目引用结构 2023-03-28 10:21:23 +08:00
2248356998 qq.com
4527c6ee5d swagger文档 2023-03-27 19:01:04 +08:00
Iot边缘设备
85829e70c1 !5 添加部署文档
* 添加部署文档
2023-03-27 10:22:30 +00:00
2248356998 qq.com
256c08d82a 属性/字段缓存获取只包含public 2023-03-27 14:49:09 +08:00
2248356998 qq.com
c2ce03c047 更新masa-1.0.0-preview.10 2023-03-27 14:27:15 +08:00
2248356998 qq.com
f2af19e198 优化变量上传属性页 2023-03-27 12:00:10 +08:00
2248356998 qq.com
930b7c092d 采集设备活动时间应正常刷新 2023-03-27 10:51:54 +08:00
2248356998 qq.com
00757c69c6 添加设备复制功能 2023-03-27 10:42:02 +08:00
2248356998 qq.com
55f267d0fc update code collation 2023-03-27 08:49:10 +08:00
2248356998 qq.com
6b96aff6e8 update code collation 2023-03-26 19:48:08 +08:00
2248356998 qq.com
32b773a8fa 更新nuget包 2023-03-26 18:52:16 +08:00
2248356998 qq.com
03089adad6 发行1.10版本 2023-03-26 18:10:12 +08:00
2248356998 qq.com
4a1fe746ab 实时数据界面优化 2023-03-26 17:39:05 +08:00
2248356998 qq.com
aa52c05d2c 1、采用异步AutoResetEvent,修复多个设备下采集太慢的问题
2、弃用IntelligentConcurrentQueue(touchsocket集成类)
2023-03-26 17:32:29 +08:00
2248356998 qq.com
26407a43e7 1、优化设备状态页,减少signalr刷新所需包大小
2、日志前置等级添加
2023-03-24 18:32:10 +08:00
2248356998 qq.com
a02934bf19 修复导出表格时,null值报错 2023-03-23 22:09:53 +08:00
2248356998 qq.com
09c65fba09 导入错误时,忽略大于10行的错误信息显示 2023-03-23 20:01:19 +08:00
2248356998 qq.com
4305c727d0 更新readme 2023-03-22 15:29:35 +08:00
2248356998 qq.com
188339897f 优化log等级、json配置注解 2023-03-22 15:26:42 +08:00
2248356998 qq.com
4ecff9a707 OPCUA写入测试 2023-03-22 14:06:32 +08:00
2248356998 qq.com
355aed49c6 设备运行状态页面改为扩展 2023-03-22 13:46:23 +08:00
2248356998 qq.com
4717b6b0f0 更新文档 2023-03-22 10:44:44 +08:00
Diego2098
45ebe9048d rbmq插件优化 2023-03-21 23:38:00 +08:00
Diego2098
b2170c49a3 分包失败提示 2023-03-21 23:28:30 +08:00
Diego2098
dc2f4d6115 设备组列宽调整,补充上传设备组 2023-03-21 23:10:59 +08:00
Diego2098
1eb132440f 1、更新DataTypeEnum
2、OPCUA写入时需实际数据类型
2023-03-21 22:47:10 +08:00
Diego2098
a464bbc37a 更新Tests 2023-03-21 22:46:12 +08:00
2248356998 qq.com
ed995697c2 表格无数据时,修改默认宽度 2023-03-21 18:17:18 +08:00
2248356998 qq.com
163cd84c7b S7nuget版本 2023-03-21 15:44:50 +08:00
2248356998 qq.com
293d7cc292 masa nuget版本更改 2023-03-21 14:31:36 +08:00
2248356998 qq.com
5de1b4e74c GC策略修改 2023-03-21 14:07:17 +08:00
2248356998 qq.com
7b474975da 更新文档 2023-03-21 14:03:49 +08:00
2248356998 qq.com
beab51516b 更新文档 2023-03-21 13:56:14 +08:00
2248356998 qq.com
fe8685a50c 修改s7属性注释 2023-03-21 13:51:05 +08:00
2248356998 qq.com
f9af5d0885 更新readme 2023-03-21 13:49:10 +08:00
2248356998 qq.com
e8136a9720 更新S7协议插件 2023-03-21 13:45:58 +08:00
2248356998 qq.com
531e5d4556 修改S7特殊方法 2023-03-21 13:41:32 +08:00
2248356998 qq.com
e66255963a 修改s7 2023-03-21 13:38:43 +08:00
2248356998 qq.com
246aac8ee4 添加西门子S7协议插件 2023-03-21 13:37:17 +08:00
2248356998 qq.com
23cfeff685 版本恢复 2023-03-21 11:45:18 +08:00
2248356998 qq.com
a5e7e0d126 更新nuget,暂缓链路复用功能 2023-03-20 13:34:59 +08:00
2248356998 qq.com
5bebc30ba0 默认不开启转储 2023-03-20 09:22:11 +08:00
2248356998 qq.com
0e7057f5b9 更新opcda文档 2023-03-19 23:18:24 +08:00
2248356998 qq.com
7c6c365ba4 格式清理 2023-03-19 23:12:58 +08:00
2248356998 qq.com
424c9bb0c5 修复null值报错 2023-03-19 23:02:08 +08:00
2248356998 qq.com
9d0f26594c 添加设备组,变量按设备组别搜索 2023-03-19 22:56:02 +08:00
2248356998 qq.com
99c17de079 更新readme,opcda核心库提示 2023-03-19 20:40:54 +08:00
2248356998 qq.com
b1e3dd0af6 尝试修复中文在mac上乱码 2023-03-19 17:29:01 +08:00
2248356998 qq.com
261cb89530 修正中文在mac上乱码 2023-03-19 16:45:14 +08:00
2248356998 qq.com
ff6773ba37 删除未知文件 2023-03-19 16:35:24 +08:00
2248356998 qq.com
bdfbbfcbbd Merge branch 'master' of https://gitee.com/diego2098/ThingsGateway 2023-03-19 16:34:26 +08:00
2248356998 qq.com
0c4cd56758 添加设备组功能 2023-03-19 16:34:15 +08:00
士心
4a36658321 !4 修复MacOS环境下,数据库报错的问题
* 修复macos环境下,数据库报错
2023-03-19 08:28:54 +00:00
2248356998 qq.com
7aae938685 准备更新设备组/变量组功能 2023-03-19 11:49:06 +08:00
2248356998 qq.com
3723401e7a 更新ReadMe 2023-03-18 17:56:18 +08:00
2248356998 qq.com
70631366a9 1、最后校验失败时应该提示日志
2、暂停时设备状态修正
2023-03-18 17:49:08 +08:00
2248356998 qq.com
0e40bbda3e 更新文档 2023-03-18 16:47:29 +08:00
2248356998 qq.com
e9aa475398 ByteBlock实际长度 2023-03-18 16:45:39 +08:00
2248356998 qq.com
8d2a811184 修正串口描述类ToString 2023-03-18 16:32:15 +08:00
2248356998 qq.com
dd7f5b6700 更新文档 2023-03-18 16:23:23 +08:00
2248356998 qq.com
a4f6277737 更新nuget 2023-03-18 16:16:27 +08:00
2248356998 qq.com
c2bfaacbb7 更新readme 2023-03-18 16:15:14 +08:00
2248356998 qq.com
a17cbfa2d4 添加ModbusRtu种子数据 2023-03-18 16:14:37 +08:00
2248356998 qq.com
fb9a101555 添加ModbusRtu插件 2023-03-18 16:14:25 +08:00
2248356998 qq.com
e319cf0200 添加串口基础类 2023-03-18 16:14:08 +08:00
2248356998 qq.com
0a8395ef6a 更新文档 2023-03-17 18:19:14 +08:00
2248356998 qq.com
38df5e01be 更新文档 2023-03-17 17:52:04 +08:00
2248356998 qq.com
ebd891a868 种子数据更改 2023-03-17 17:51:58 +08:00
2248356998 qq.com
4ab2395cbe 采集检测间隔修改 2023-03-17 17:40:34 +08:00
2248356998 qq.com
5f1f989fc9 上传插件添加循环间隔属性 2023-03-17 17:30:06 +08:00
2248356998 qq.com
44b709eee3 添加rbmq插件种子数据 2023-03-17 16:30:02 +08:00
2248356998 qq.com
d0d7726597 rbmq插件文件夹更名 2023-03-17 16:16:23 +08:00
2248356998 qq.com
054c342aeb 优化内存queue,修复mqtt插件可能超出字节限制的情况 2023-03-17 16:04:24 +08:00
2248356998 qq.com
c79c33baf7 添加rbmq插件 2023-03-17 16:03:44 +08:00
2248356998 qq.com
23b00e35b2 设备禁用时,变量绑定的设备对应选项会显示禁用(灰色) 2023-03-17 11:29:14 +08:00
2248356998 qq.com
fe51079266 更新readme 2023-03-16 17:33:25 +08:00
2248356998 qq.com
0791b0bbee 选择插件时自动更新属性 2023-03-16 17:33:17 +08:00
2248356998 qq.com
dbf04c8eeb 更新赞助名单 2023-03-16 11:35:58 +08:00
2248356998 qq.com
6204256df8 限流服务默认不开启 2023-03-16 09:47:20 +08:00
2248356998 qq.com
93cc8c2327 增加简易定时看板 2023-03-15 16:01:54 +08:00
2248356998 qq.com
68a2e5bbbc 更新历史配置说明 2023-03-15 09:11:33 +08:00
Diego2098
72792153f2 !3 update handbook/docs/05、网关配置/5.5、其他配置.mdx.
Merge pull request !3 from zhubanghao/N/A
2023-03-14 13:39:16 +00:00
zhubanghao
88b6ef1897 update handbook/docs/05、网关配置/5.5、其他配置.mdx.
Signed-off-by: zhubanghao <58813184@qq.com>
2023-03-14 13:05:33 +00:00
2295 changed files with 122809 additions and 136503 deletions

14
.gitignore vendored
View File

@@ -360,16 +360,4 @@ MigrationBackup/
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/src/*Pro*/
/src/*Pro*
/src/*pro*
/src/*pro*/
/doc/.*
/doc/build/
/src/ThingsGateway.Server/.config/
/src/nuget.exe
/src/nupkgs/
/src/nupkgs
FodyWeavers.xsd

202
LICENSE
View File

@@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Cachetribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2023-present Diego
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

202
LICENSE.txt Normal file
View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2023-present Diego
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,72 +1,37 @@
# ThingsGateway

## Introduction

A cross-platform, high-performance edge data collection gateway based on net8, capable of handling millions of data points per.

## Documentation

[Documentation](https://kimdiego2098.github.io/).

[NuGet](https://www.nuget.org/packages?q=Tags%3A%22ThingsGateway%22)

### Plugin List

#### Data Collection Plugins
| Plugin Name | Remarks |
|-------|-------|
| Modbus | Supports Rtu/Tcp message formats, with Serial/Tcp/Udp links |
| SiemensS7 | Siemens PLC S7 series |
| Dlt6452007 | Supports Serial/Tcp/Udp links |
| OpcDaMaster | Compiled for 64-bit |
| OpcUaMaster | Supports certificate login, object extension, Json read/write |
## 介绍
#### Business Plugins
**NetCore** 跨平台边缘采集网关(工业设备采集)
| Plugin Name | Remarks |
|-------|-------|
| ModbusSlave | Supports Rtu/Tcp message formats, with Serial/Tcp/Udp links, supports Rpc reverse writing |
| OpcUaServer | OpcUa server, supports Rpc reverse writing |
| MqttClient | Mqtt client, supports Rpc reverse writing, script-customizable upload content |
| MqttServer | Mqtt server, supports WebSocket, supports Rpc reverse writing, script-customizable upload content |
| KafkaProducer | Script-customizable upload content |
| RabbitMQProducer | Script-customizable upload content |
| SqlDB | Relational database storage, supports historical storage and real-time data updates |
| SqlHisAlarm | Alarm historical data relational database storage |
| TDengineDB | Time-series database storage |
| QuestDB | Time-series database storage |
**ThingsGateway** 存储库同时提供 [**设备采集驱动**](https://www.nuget.org/profiles/KimDiego)

## License

[Apache-2.0](https://gitee.com/diego2098/ThingsGateway/blob/master/LICENSE)

## Demo

[ThingsGateway Demo Address](http://47.119.161.158:5000/)

Account: **SuperAdmin**

Password: **111111**

**In the upper-right corner, switch to the IoT Gateway module in the personal popup box**
**ThingsGateway** 存储库同时提供 **基于Blazor的权限框架** 查看 [**ThingsGateway.Admin**](https://gitee.com/dotnetchina/ThingsGateway/blob/master/framework/ThingsGateway.Admin.sln)
## 文档
[ThingsGateway](https://diego2098.gitee.io/thingsgateway-docs/) 文档。
## 协议
[ThingsGateway](https://gitee.com/diego2098/ThingsGateway) 采用 [Apache-2.0](https://gitee.com/diego2098/ThingsGateway/blob/master/LICENSE.zh) 开源协议。
## 演示
[ThingsGateway演示地址](http://120.24.62.140:5000/)
账户 : **superAdmin** 密码 : **111111**
## 赞助
[ThingsGateway赞助途径](https://diego2098.gitee.io/thingsgateway-docs/docs/donate)
## 社区
QQ群605534569
## Docker
```shell
docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway
```

## Sponsorship

[Sponsorship Approach](https://kimdiego2098.github.io/docs/1000)

## Community

QQ Group: 605534569 [Jump](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=NnBjPO-8kcNFzo_RzSbdICflb97u2O1i&authKey=V1MI3iJtpDMHc08myszP262kDykbx2Yev6ebE4Me0elTe0P0IFAmtU5l7Sy5w0jx&noverify=0&group_code=605534569)

## Pro Plugins

[Plugin List](https://kimdiego2098.github.io/docs/1001)

View File

@@ -1,73 +0,0 @@
# ThingsGateway
## 介绍
基于net8的跨平台高性能边缘采集网关单机采集数据点位可达百万
## 文档
[文档](https://kimdiego2098.github.io/)
[NuGet](https://www.nuget.org/packages?q=Tags%3A%22ThingsGateway%22)
### 插件列表
#### 采集插件
| 插件名称 | 备注 |
|-------|-------|
| Modbus | Rtu/Tcp报文格式支持串口/Tcp/Udp链路 |
| SiemensS7 | 西门子PLC S7系列 |
| Dlt6452007 | 支持串口/Tcp/Udp链路 |
| OpcDaMaster | 64位编译 |
| OpcUaMaster | 支持证书登录扩展对象Json读写 |
#### 业务插件
| 插件名称 | 备注 |
|-------|-------|
| ModbusSlave | Rtu/Tcp报文格式支持串口/Tcp/Udp链路支持Rpc反写 |
| OpcUaServer | OpcUa服务端支持Rpc反写 |
| MqttClient | Mqtt客户端支持Rpc反写脚本自定义上传内容 |
| MqttServer | Mqtt服务端支持WebSocket支持Rpc反写脚本自定义上传内容 |
| KafkaProducer | 脚本自定义上传内容 |
| RabbitMQProducer | 脚本自定义上传内容 |
| SqlDB | 关系数据库存储,支持历史存储和实时数据更新 |
| SqlHisAlarm | 报警历史数据关系数据库存储 |
| TDengineDB | 时序数据库存储 |
| QuestDB | 时序数据库存储 |
## 协议
[Apache-2.0](https://gitee.com/diego2098/ThingsGateway/blob/master/LICENSE)
## 演示
[ThingsGateway演示地址](http://47.119.161.158:5000/)
账户 : **SuperAdmin**
密码 : **111111**
**右上角个人弹出框中,切换到物联网关模块**
## Docker
```shell
docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway
```
## 赞助
[赞助途径](https://kimdiego2098.github.io/docs/1000)
## 社区
QQ群605534569 [跳转](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=NnBjPO-8kcNFzo_RzSbdICflb97u2O1i&authKey=V1MI3iJtpDMHc08myszP262kDykbx2Yev6ebE4Me0elTe0P0IFAmtU5l7Sy5w0jx&noverify=0&group_code=605534569)
## Pro插件
[插件列表](https://kimdiego2098.github.io/docs/1001)

View File

@@ -1,15 +0,0 @@
文档基于 [https://www.docusaurus.io/](https://www.docusaurus.io/) 构建。
### 本地运行
```bash
npm install
npm run start
```
### 发布部署
```bash
npm run build
```

View File

@@ -1,57 +0,0 @@
---
id: 1
title: 版权说明
---
:::tip 公告
注意以下常见版权问题:
- 社区版本不得去除可视页面的ThingsGateway Logo
- 不得将程序集单独包装售卖,申请专利,开发竞品
:::
## 使用前必要阅读
ThingsGateway 由作者Diego及其他贡献者开发所有版权归作者Diego所有程序集源代码在遵循 Apache License 2.0 的开源协议以及**附加协议**下,可**免费**供其他开发者二次开发或(商业)使用。
### 个人使用须知:
- 不得将程序集用作违法犯罪活动。
- 不得将程序集单独包装售卖,申请专利等。
- 不得擦除程序集所有有关作者的信息。
**以上内容必须全部符合,个人使用授权才成立。**
### 二次开发须知:
- 不得将程序集用作违法犯罪活动。
- 不得将程序集单独包装售卖,申请专利等。
- 不得擦除程序集所有有关作者的信息。
- 二次开发完成后的作品必须附带源作品所有作者信息包括但不限于作者名、Gitee、Github 地址等。
**以上内容必须全部符合,二次开发授权才成立。**
### 盈利性(商业)用途使用须知:
- 不得将程序集用作违法犯罪活动。
- 不得将程序集单独包装售卖,申请专利等。
- **不得擦除程序集所有有关作者的信息,并必须于用户可见界面(如关于)中提名。**
**以上内容必须全部符合,商业使用授权才成立。**
## ThingsGatewayPro 商用许可
ThingsGatewayPro 软件框架与 ThingsGateway 一致另包含其他定制插件。所有版权归作者Diego所有。
ThingsGatewayPro 不公开开源。
# 免责申明
**在使用 ThingsGateway 之前请进行缜密的测试。在使用期间,由本程序集造成或间接造成的所有损失,均自己承担,与本程序集无关。**

View File

@@ -1,45 +0,0 @@
---
id: 100
title: 驱动调试
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `配置须知`
变量地址的格式可从浮动提示中查看,如需要详细说明,可查看对应的插件章节
:::
## 一、说明
**ThingsGateway** 网关程序中包含了调试页面,也单独提供跨平台的桌面端调试软件
<img src={require("@site/static/img/docs/驱动调试.png").default} />
下面举例说明Modbus驱动的调试流程
## 二、Modbus调试流程
选择需要的驱动,进入页面后,新建通道
<img src={require("@site/static/img/docs/驱动调试1.png").default} />
<img src={require("@site/static/img/docs/驱动调试2.png").default} />
2、 查看变量寄存器地址的填写格式
<img src={require("@site/static/img/docs/驱动调试3.png").default} />
3、 打开模拟软件,点击读取
<img src={require("@site/static/img/docs/驱动调试4.png").default} />
可以看到交互的报文以及读取结果
## 三、网关中的调试页面
<img src={require("@site/static/img/docs/驱动调试5.png").default} />
操作与桌面软件一样

View File

@@ -1,28 +0,0 @@
---
id: 1000
title: 赞助项目
---
## 赞助ThingsGateway项目
> 您的支持就是我不懈努力的动力。<br></br>如果对您有帮助请⭐Star关注或扫码捐赠感谢支持开源
### 赞助途径
![](/img/pay.png)
### 赞助名单(以下排名只按照赞助时间顺序)
|序号|名称|金额|
|-----------|--------------|-----------------|
|1| 绢| 10¥|
|2| 小蚂蚁 |500+¥|
|3| *伟 |18.8¥|
|4| *碟 |20¥|
|5| *长 |6.66¥|
|6| 小黄鸭 |38.8¥|
|7| *交 |50¥|
|8| *洋 |200¥+50¥|
|9| *元 |20¥|
|10| 冬日暖阳 |66.66¥|

View File

@@ -1,9 +0,0 @@
---
id: 10001
title: ABCipMatser
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';

View File

@@ -1,96 +0,0 @@
---
id: 1001
title: Pro版
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip 公告
注意以下常见版权问题:
- 社区版本不得去除可视页面的ThingsGateway Logo
- ThingsGatewayPro授权后可去除Logo但Pro插件不开放源代码
- 任何版本不得将程序集单独包装售卖,申请专利,开发竞品
:::
## 一、说明
ThingsGatewayPro是ThingsGateway的加强版本**基础功能与ThingsGateway一致并添加一些额外功能插件**
同时ThingsGatewayPro提供企业定制服务及必要的远程协助,具体收费可以咨询**作者Diego联系方式QQ2248356998**
## 二、授权
** ThingsGatewayPro分为个人授权与企业授权区别在于授权归属**
ThingsGatewayPro授权不开放源代码**Pro版本基础代码和开源版本相同**
授权后获得证书凭据(图片形式)
### 2.1 个人授权
- **授权归属于购买者个人所有**
- 价格 998¥
### 2.2 企业授权
- **授权归属于企业所有,仅企业主体享有授权**
- 价格 1998¥
## 三、插件差异
|序号| 插件名称 | 说明 |
|----| ---------------| --------------------------|
|1| Vigor | 丰炜串口/TCP通信插件支持VS系列|
|2| Fins Tcp/Udp | 欧姆龙Fins通信插件支持CJ系列、CV系列、CS系列、NX系列等,一般欧姆龙带网口的都支持FINS|
|3| ABCIP Tcp | 罗克韦尔CIP通信插件支持17561769系列等|
|4| SECS | SECS半导体协议|
|5| 三菱MC QnA3E_Binary | MC 3E帧 二进制 |
|6| USB扫码枪 | USB扫码枪(键盘输入式),键盘钩子获取的方式目前只有windows版本|
|7| URF_R330 读卡器 | dll目前只有windows版本|
|8| 精伦idr 210 读卡器 | dll目前只有windows版本|
|9| 明泰URF_R330 读卡器 | dll目前只有windows版本|
|10| 新中新DKQ-A16D 读卡器 | dll目前只有windows版本|
## 四、插件开发计划
|序号| 插件名称 | 说明 |
|----| ---------------| --------------------------|
|1| 双机热备 | 网关双机冗余|
|2| 远程更新 | 远程更新软件|
## 五、授权名单(部分企业用户不公示)
|序号| 被授权主体 | 说明 | 时间 |
|----| ---------------| --------------------------|-------------------|
|1| 成都**创新科技有限公司 | | 2023-4-21|
|2| 超级士兵 | | 2023-5-18|
|3| SunnyUI | | 2023-7-13|
|4| 俞智峰 | | 2023-7-13|
|5| 西安***物联网科技有限公司 | | 2023-7-15|
|6| 深圳市***自动化技术有限公司 | | 2023-7-16|
|7| 西安***信息技术有限责任公司 | | 2023-9-4|
|8| 北京****网络科技发展有限公司 | | 2023-9-26|
|9| 长沙**软件科技有限公司 | | 2023-10-16|
|10| 航科**科技有限公司 | | 2023-10-30|
|11| 福建**包装有限公司 | | 2023-11-17|
|12| 内蒙古**科技有限公司 | | 2023-11-26|
|13| 佛山**自动化科技有限公司 | | 2023-11-27|
|14| Z | | 2023-12-03|
|15| 狼有一心 | | 2023-05-29|
## 六、购买途径
**购买前请先联系作者Diego**。联系QQ2248356998。
![](/img/pay.png)

View File

@@ -1,24 +0,0 @@
---
id: 1002
title: 联系我们
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
**ThingsGateway团队**成立1年来一直致力于工业物联网关解决方案。我们的初衷是使设备接入更简单为用户打造提高效率的产品。
可以通过以下方式找到我们:
### 技术支持
QQ群605534569
QQ2248356998
### 咨询、合作
手机15622119120 林工
微信15622119120

View File

@@ -1,37 +0,0 @@
---
id: 101
title: 插件管理
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `配置须知`
更改设备/变量/插件等,需要重启后台(右上角重启后台按钮)
:::
## 一、说明
**ThingsGateway** 网关核心代码都由插件完成,主程序只负责调度执行
插件支持热重载,可由外部上传到网关中
## 二、上传插件
<img src={require("@site/static/img/docs/上传插件.png").default} />
## 二、手动重载插件
<img src={require("@site/static/img/docs/重载插件.png").default} />
可由顶部按钮或者插件管理页面按钮执行手动重载
:::tip 提示
插件重新检测文件后,运行态的插件不会发送任何改变,如果立即生效,请按右上角的重启后台按钮
:::

View File

@@ -1,39 +0,0 @@
---
id: 102
title: 通道
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `配置须知`
更改设备/变量/插件等,需要重启后台(右上角重启后台按钮)
:::
## 一、说明
**ThingsGateway** 网关通道其实是一个实际的串口/TCP/UDP链路或者是线程池中的一个任务
## 二、添加通道/修改通道
<img src={require("@site/static/img/docs/添加通道.png").default} />
## 三、通道配置项
| 属性| 说明 |
| --- | --- |
| 名称 | 通道名称|
| 通道类型 | 选择 TcpClient/TcpService/SerialPortClient/UdpSession/Other |
| 使能 | 是否启用此通道 |
| 调试日志 | 初始运行时,是否启用调试日志,可在运行状态界面中再次启用/停用 |
| 远程地址 | 对于TcpClient/UdpSession 作为客户端有效, 填入服务端的Url信息比如192.168.0.1:502 |
| 本地地址 | 对于TcpClient/TcpService/UdpSession 有效,作为本机的绑定地址,可选择填入,为空时是随机绑定端口 |
| COM口 | 对于SerialPortClient有效串口名称 |
| 波特率 | 对于SerialPortClient有效串口波特率 |
| 数据位 | 对于SerialPortClient有效串口数据位 |
| 校验位 | 对于SerialPortClient有效串口校验位 |
| 停止位 | 对于SerialPortClient有效串口停止位 |
| 启用Dtr | 对于SerialPortClient有效串口DtrEnable |
| 启用Rts | 对于SerialPortClient有效串口RtsEnable |

View File

@@ -1,46 +0,0 @@
---
id: 103
title: 设备
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `配置须知`
更改设备/变量/插件等,需要重启后台(右上角重启后台按钮)
:::
## 一、说明
**ThingsGateway** 网关设备对应每个实际采集设备/上传业务
## 二、添加设备/修改设备
<img src={require("@site/static/img/docs/添加设备.png").default} />
## 三、设备属性配置项
| 属性| 说明 |
| --- | --- |
|名称| 设备名称|
|描述| 当前设备描述 |
|默认执行间隔| 执行间隔,对于采集设备,这个属性是默认的采集间隔,对于业务设备,这个属性是循环线程的等待间隔时间 |
|设备使能| 启动/停用采集设备 |
|通道| 选择对应的通道 |
|插件| 选择对应的插件 |
|是否冗余| 启动/停用设备冗余 |
|冗余设备| 备用设备选择,当此设备离线时,会在适当的时间切换到备用设备,注意备用设备初始时不会有实际通讯线程创建,链接的变量也不会生效 |
|备用字段| 存储自定义信息 |
## 四、插件属性配置项
对于不同的插件,插件属性项也不相同,查看对应插件章节中的详细说明。
比如ModbusMaster
<img src={require("@site/static/img/docs/插件属性.png").default} />

View File

@@ -1,124 +0,0 @@
---
id: 104
title: 变量
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `配置须知`
更改设备/变量/插件等,需要重启后台(右上角重启后台按钮)
:::
## 一、说明
**ThingsGateway** 网关变量对应每个寄存器点位
## 二、添加变量/修改变量
### 变量基础属性配置项
<img src={require("@site/static/img/docs/添加变量.png").default} />
|属性名称| 属性描述| 备注|
|-----------|--------------|-----------------|
|名称| 当前变量名称,全局唯一(变量)| |
|描述| 当前变量描述 ||
|单位| 变量值单位 ||
|读写权限| 读写/只写/只读 ||
|使能| 启用/停用变量 ||
|远程写入| 对于变量的写入使能配置 ||
|设备| 当前采集设备选择的设备,通过级联选择器选择对应设备名称设置 ||
|变量地址| PLC寄存器/OPC ITEMID等 |对于不同插件的设备,变量地址配置不相同,查看对应的插件说明|
|执行间隔| 读取时间间隔/执行特殊方法读取的间隔 ||
|特殊方法| 某些插件特有的方法 |对于不同的插件,特殊方法配置不相同,查看对应的插件说明|
|数据类型| 对应的数据类型 |注意除了特殊驱动一般不应该选择object|
|读取表达式| 动态解析的表达式 ,原始值的代码为raw|示例:``raw.ToInt()*10+3`` 结果原始值raw为8,输出实时值83 。|
|写入表达式| 动态解析的表达式,在写入值时转化,原始值的代码为raw|示例:``raw.ToInt()/10`` 结果写入值为230时会下发23到PLC 。|
|备用字段| 存储自定义信息 |
:::tip `变量地址通用说明`
通用格式,不区分大小写
4字节转换格式
DATA=ABCD;
举例:
DATA=ABCD; ,代表大端格式,其中
ABCD=>Big-Endian;
BADC=>Big-Endian Byte Swap;
CDAB=>Little-Endian Byte Swap;
DCBA=>Little-Endian
字符串长度:
LEN=1;
BCD格式
BCD=C8421;其中有C8421;C5421;C2421;C3;Gray
字符格式:
encoding=UTF8;其中有UTF8;ASCII;Default;Unicode
数组长度:
arraylen=2;
:::
### 报警属性配置项
<img src={require("@site/static/img/docs/添加变量1.png").default} />
:::tip `说明`
报警属性中定义变量产生报警的规则所需的配置
:::
|属性名称| 属性描述| 备注|
|-----------|--------------|-----------------|
|报警使能| 启用对应报警功能| |
|报警限值| 超限时产生报警,布尔量为固定 ||
|报警文本| 对应显示的报警文本 ||
|报警约束| 动态解析的表达式 ,原始值的代码为raw计算值为true时才能产生报警 ||
:::tip `例子`
数值高高报警
变量值大于报警限值并且报警约束为true或者报警约束不存在时产生报警
比如设置高高限值为1其他默认当变量值大于1时产生报警
:::
### 业务属性配置项
<img src={require("@site/static/img/docs/添加变量2.png").default} />
:::tip `说明`
上传属性中定义变量关联的上传设备所需的配置
对于不同的插件,插件属性项也不相同,查看对应插件章节中的详细说明。
:::

View File

@@ -1,34 +0,0 @@
---
id: 105
title: 网关状态
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
**ThingsGateway**
运行状态页面,可查看采集/业务设备的运行状态,调试日志等信息
实时数据页面,可查看变量实时信息
实时报警页面,可查看变量实时报警
硬件信息页面可查看服务器CPU信息等
## 二、图示
<img src={require("@site/static/img/docs/运行状态详情.png").default} />
<img src={require("@site/static/img/docs/实时数据详情.png").default} />
<img src={require("@site/static/img/docs/实时报警详情.png").default} />
<img src={require("@site/static/img/docs/硬件信息详情.png").default} />

View File

@@ -1,26 +0,0 @@
---
id: 106
title: 网关日志
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
**ThingsGateway**
后台日志记录 有关采集/业务上传的全部网关后台日志
RPC日志记录 全部反写RPC日志
## 二、图示
<img src={require("@site/static/img/docs/RPC日志详情.png").default} />
<img src={require("@site/static/img/docs/后台日志详情.png").default} />

View File

@@ -1,63 +0,0 @@
---
id: 2
title: 产品介绍
---
## 产品介绍
**ThingsGateway** 是c#开发的一款边缘采集网关,核心分为四大部分
### 通道
通道实际上相当于一个实际的通讯链路比如一个串口一个TCP连接等在**ThingsGateway**中,
通道也会作为线程池中的一个任务,对于同一个通道中的不同设备,采集/业务方法是顺序进行的。
### 🔥插件
ThingsGateway中的采集方法或者上传方法等都由插件完成主程序只负责调度执行。
对于不同的采集协议或者业务需求,可以通过开发插件完成自定义的业务操作。
### 设备
建立设备,必须指定通道以及插件,也可以说设备其实是插件的配置。
同时对于采集设备、业务设备,会有些许差别。
采集设备:采集数据入网关/写入数据到现场
业务设备:上传数据到第三方/第三方RPC反写
### 变量
变量,用于配置采集设备的具体点位详情,以及对应业务设备中的配置项
## 产品特性
### 可视化操作
通过web浏览器配置调试验证整个流程
### 🔥脚本支持
灵活的数据转换脚本以及数据上传自定义实体脚本,可适配各大云平台的物模型
### 🔥自定义插件支持
通过开发插件完成自定义的业务操作。
### 🔥性能
测试100w变量点位500ms-1000ms全部采集完成稳定连续采集占用CPU资源、内存资源低
### 断线缓存
支持断线缓存,恢复后自动上传
### 🔥完整可商用的边缘网关
完善的配置权限操作日志功能等还有OPCWeb Api,Mqtt,Kafka,时序库,变量报警等更多功能等待你发现

View File

@@ -1,78 +0,0 @@
---
id: 200
title: ModbusMatser
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
ModbusMatser作为主站主动采集Modbus从站协议的设备
插件支持modbusTcp/modbusRtu格式报文
通讯链路支持 TcpClient/TcpService(DTU)/串口/Udp
## 二、插件属性配置项
<img src={require("@site/static/img/docs/ModbusMaster.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| Modbus协议类型 | modbusTcp/modbusRtu格式报文 | |
| 默认站号 | 默认的mudbus站号id | **变量可单独配置站号** |
| 无交互2min时断开连接 | 没有发送/收到消息 2分钟后断开连接 | 仅适用于TcpService链路DTU模式|
| 心跳检测 | 大写16进制字符串符合心跳内容会自动回应 | 仅适用于TcpService链路DTU模式|
| 读写超时时间 | 读写超时时间 | 3000|
| 连接超时时间 | 建立通讯链路的超时时间 | 3000|
| 发送延时时间 | 在发送请求前的延时时间 | 0|
| 组包缓存超时 | 返回分包时的分包间隔超时时间 | 1000 |
| 默认解析顺序 | 4个字节以上的数据解析可设置为ABCD/BADC/CDBA/DCBA,默认ABCD , **变量可单独配置**|ABCDBig-Endian<br></br>BADCBig-Endian Byte Swap<br></br>CDABLittle-Endian Byte Swap<br></br>DCBALittle-Endian |
| 最大打包长度 | 打包长度最大限值是125 | 100 |
| 离线重试间隔 | 设备检测到离线时,重新连接的间隔时间(秒) | 30 |
| 失败重试次数 | 读取失败时重试n次后判定变量为离线 | 3 |
| 最大并发数量 | ModbusTcp格式报文特有ModbusTcp可并发采集 | 1 |
## 三、变量地址配置项
- 1、基本地址
Modbus PLC寄存器
| 地址 | 功能码 | 说明 |
| ---------------| --------------|--------------------------|
| 4xxxxx | 03 | 读取03功能码 |
| 3xxxxx | 04 | 读取04功能码 |
| 1xxxxx | 02 | 读取02功能码 |
| 0xxxxx | 01 | 读取01功能码 |
- 2、站号(可选)
当需要指定站号地址时可使用,举例:
| 地址 | 说明 |
| ---------------| --------------------------|
| s=2;10001 | 读取02功能码 ,设备地址为2 |
| s=11;40001 | 读取03功能码 ,设备地址为11 |
- 3、写入功能码(可选)
当需要指定16/15功能码时可使用举例
| 地址 | 说明 |
| ---------------| --------------------------|
| w=15;10001 | 读取02功能码 ,写入15功能码 |
| w=16;40001 | 读取03功能码 ,写入16功能码 |
- 3、Dtu注册(可选)
当需要指定Dtu客户端可使用举例
| 地址 | 说明 |
| ---------------| --------------------------|
| id=12;40001 | 读取03功能码 ,设备地址为默认Dtu注册包为"12",注意是UTF8格式 |

View File

@@ -1,96 +0,0 @@
---
id: 20001
title: Modbus
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 定义
程序集:[ThingsGateway.Foundation.Modbus](https://www.nuget.org/packages/ThingsGateway.Foundation.Modbus)
## 一、说明
**ThingsGateway.Foundation.Modbus**是对于Modbus协议的封装类库
支持Tcp/Rtu格式
支持多个通讯链路Tcp/Udp/SerialPort
支持Dtu
## 二、Modbus主站
1、创建ModbusMaster
```
/// <summary>
/// 新建链路
/// </summary>
/// <returns></returns>
public IChannel GetChannel()
{
TouchSocketConfig touchSocketConfig = new TouchSocketConfig();
return touchSocketConfig.GetSerialPortWithOption(new("COM1")); //直接获取串口对象
//return touchSocketConfig.GetChannel(ChannelTypeEnum.SerialPortClient, null, null, new("COM1"));//通过链路枚举获取对象
}
/// <summary>
/// 新建协议对象
/// </summary>
/// <param name="channel"></param>
/// <returns></returns>
public IProtocol GetProtocol(IChannel channel)
{
var client = new ModbusMaster(channel);
return client;
}
```
2、读写操作
```
ModbusMaster modbusMasterTest = new ModbusMaster();
var channel = modbusMasterTest.GetChannel();
var protocol = modbusMasterTest.GetProtocol(channel);
var data = await protocol.ReadDoubleAsync("400001"); //读取保持寄存器地址0
```
`400001`是PLC Modbus的地址表示方式代表保持寄存器地址0
- 基本地址
Modbus PLC寄存器
| 地址 | 功能码 | 说明 |
| ---------------| --------------|--------------------------|
| 4xxxxx | 03 | 读取03功能码 |
| 3xxxxx | 04 | 读取04功能码 |
| 1xxxxx | 02 | 读取02功能码 |
| 0xxxxx | 01 | 读取01功能码 |
- 站号(可选)
当需要指定站号地址时可使用,举例:
| 地址 | 说明 |
| ---------------| --------------------------|
| s=2;10001 | 读取02功能码 ,设备地址为2 |
| s=11;40001 | 读取03功能码 ,设备地址为11 |
- Dtu注册(可选)
当需要指定Dtu客户端可使用举例
| 地址 | 说明 |
| ---------------| --------------------------|
| id=12;40001 | 读取03功能码 ,设备地址为默认Dtu注册包为"12",注意是UTF8格式 |
## 三、Modbus从站

View File

@@ -1,9 +0,0 @@
---
id: 20002
title: SiemensS7
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';

View File

@@ -1,9 +0,0 @@
---
id: 20003
title: OpcDa
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';

View File

@@ -1,9 +0,0 @@
---
id: 20004
title: OpcUa
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';

View File

@@ -1,112 +0,0 @@
---
id: 20005
title: Dlt645
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 定义
程序集:[ThingsGateway.Foundation.Dlt645](https://www.nuget.org/packages/ThingsGateway.Foundation.Dlt645)
## 一、说明
**ThingsGateway.Foundation.Dlt645**是对于Dlt645-2007协议的封装类库
支持多个通讯链路Tcp/Udp/SerialPort
## 二、Dlt645-2007主站
1、创建Dlt645Master
```
/// <summary>
/// 新建链路
/// </summary>
/// <returns></returns>
public IChannel GetChannel()
{
TouchSocketConfig touchSocketConfig = new TouchSocketConfig();
return touchSocketConfig.GetSerialPortWithOption(new("COM1")); //直接获取串口对象
//return touchSocketConfig.GetChannel(ChannelTypeEnum.SerialPortClient, null, null, new("COM1"));//通过链路枚举获取对象
}
/// <summary>
/// 新建协议对象
/// </summary>
/// <param name="channel"></param>
/// <returns></returns>
public IProtocol GetProtocol(IChannel channel)
{
var client = new Dlt645_2007Master(channel);
client.Station = "311111111114";//表号
return client;
}
```
2、读写操作
```
Dlt645MasterTest dlt645MasterTest = new Dlt645MasterTest();
var channel = dlt645MasterTest.GetChannel();
var protocol = dlt645MasterTest.GetProtocol(channel);
var data = await protocol.ReadDoubleAsync("02010100"); //读取A相电压
```
`02010100`是Dlt645中的地址表示方式代表A相电压请查看相关协议文档可在源码附件中找到文档
- 基本地址
| 地址 | 说明 |
| ---------------| --------------------------|
| 02010100 | 读取02010100(A相电压) |
参考DLT2007协议文档数据标识可在插件源码中找到附件
- 站号(可选)
当需要指定站号地址时可使用,举例:
| 地址 | 说明 |
| ---------------| --------------------------|
| s=111111111111;02010100 | 读取02010100 ,设备地址为111111111111 |
- Dtu注册(可选)
当需要指定Dtu客户端可使用举例
| 地址 | 说明 |
| ---------------| --------------------------|
| id=12;40001 | 读取03功能码 ,设备地址为默认Dtu注册包为"12",注意是UTF8格式 |
3、其他方法
修改密码
```
var result = await protocol.WritePasswordAsync(level, oldPassword, newPassword);
```
更改表号
```
var result = await protocol.WriteDeviceStationAsync(station);
```
修改波特率
```
var result = await protocol.WriteBaudRateAsync(baudRate);
```
读取表号
```
var result = await protocol.ReadDeviceStationAsync;
```

View File

@@ -1,58 +0,0 @@
---
id: 201
title: ModbusSlave
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
ModbusSlave作为从站响应主站的采集报文
插件支持modbusTcp/modbusRtu格式报文
通讯链路支持 TcpClient/TcpService(DTU)/串口/Udp
## 二、插件属性配置项
<img src={require("@site/static/img/docs/ModbusSlave.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| Modbus协议类型 | modbusTcp/modbusRtu格式报文 | |
| 默认站号 | 默认的mudbus站号id | **变量可单独配置站号** |
| 默认解析顺序 | 4个字节以上的数据解析可设置为ABCD/BADC/CDBA/DCBA,默认ABCD , **变量可单独配置**|ABCDBig-Endian<br></br>BADCBig-Endian Byte Swap<br></br>CDABLittle-Endian Byte Swap<br></br>DCBALittle-Endian |
| 无交互2min时断开连接 | 没有发送/收到消息 2分钟后断开连接 | 仅适用于TcpService链路|
| 组包缓存超时 | 分包时的分包间隔超时时间 | 1000 |
| 多站点 | 是否区分不同的站号的数据 | true|
| 允许写入 | 写入权限使能 | Flase |
| 立即写入内存 | 外部写入时,是否立即写入内存池 | Flase |
## 三、变量业务属性
### 1、从站地址
- 1、基本地址
Modbus PLC寄存器
| 地址 | 功能码 | 说明 |
| ---------------| --------------|--------------------------|
| 4xxxxx | 03 | 读取03功能码 |
| 3xxxxx | 04 | 读取04功能码 |
| 1xxxxx | 02 | 读取02功能码 |
| 0xxxxx | 01 | 读取01功能码 |
- 2、站号(可选)
当需要指定站号地址时可使用,举例:
| 地址 | 说明 |
| ---------------| --------------------------|
| s=2;10001 | 读取02功能码 ,设备地址为2 |
| s=11;40001 | 读取03功能码 ,设备地址为11 |

View File

@@ -1,72 +0,0 @@
---
id: 202
title: Dlt645Master
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
Dlt645Master作为主站主动采集Dlt645协议的设备
插件支持Dlt645-2007格式报文
通讯链路支持 TcpClient/TcpService(DTU)/串口/Udp
## 二、插件属性配置项
<img src={require("@site/static/img/docs/Dlt645Master.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 无交互2min时断开连接 | 没有发送/收到消息 2分钟后断开连接 | 仅适用于TcpService链路DTU模式|
| 心跳检测 | 大写16进制字符串符合心跳内容会自动回应 | 仅适用于TcpService链路DTU模式|
| 读写超时时间 | 读写超时时间 | 3000|
| 连接超时时间 | 建立通讯链路的超时时间 | 3000|
| 发送延时时间 | 在发送请求前的延时时间 | 0|
| 组包缓存超时 | 返回分包时的分包间隔超时时间 | 1000 |
| 默认解析顺序 | 4个字节以上的数据解析可设置为ABCD/BADC/CDBA/DCBA,默认ABCD , **变量可单独配置**|ABCDBig-Endian<br></br>BADCBig-Endian Byte Swap<br></br>CDABLittle-Endian Byte Swap<br></br>DCBALittle-Endian |
| 默认地址 | 电表地址12个字符 | |
| 密码 | 协议写入所需密码 | Flase |
| 操作员代码 | 协议写入所需操作员代码 | Flase |
| 前导符报文头 | 设为true时发送请求将添加4个0xFE到报文头部 | Flase |
| 离线重试间隔 | 设备检测到离线时,重新连接的间隔时间(秒) | 30 |
| 失败重试次数 | 读取失败时重试n次后判定变量为离线 | 3 |
## 三、变量地址配置项
- 1、基本地址
| 地址 | 说明 |
| ---------------| --------------------------|
| 02010100 | 读取02010100(A相电压) |
参考DLT2007协议文档数据标识可在插件源码中找到附件
- 2、站号(可选)
当需要指定站号地址时可使用,举例:
| 地址 | 说明 |
| ---------------| --------------------------|
| s=111111111111;02010100 | 读取02010100 ,设备地址为111111111111 |
- 3、Dtu注册(可选)
当需要指定Dtu客户端可使用举例
| 地址 | 说明 |
| ---------------| --------------------------|
| id=12;02010100 | 读取02010100 ,设备地址为默认Dtu注册包为"12",注意是UTF8格式 |
:::tip `说明`
注意DLT645协议中所有的变量都支持String
:::

View File

@@ -1,51 +0,0 @@
---
id: 203
title: SiemensS7Master
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
SiemensS7Master作为主站主动采集西门子S7协议的设备
插件支持S7格式报文支持S7-200;S7200-SMART;S7-300;S7-400;S7-1200;S7-1500;
通讯链路支持 TcpClient/Udp(通常不存在)
## 二、插件属性配置项
<img src={require("@site/static/img/docs/SiemensS7Master.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| S7类型 | S200;S200SMART;S300;S400;S1200;S1500; | |
| 机架号 | 机架号 | 0|
| 槽位号 | 槽位号 | 0|
| LocalTSAP | 查看西门子localTsap说明网关中一般不需要再设置 | 0 |
| 读写超时时间 | 读写超时时间 | 3000|
| 连接超时时间 | 建立通讯链路的超时时间 | 3000|
| 发送延时时间 | 在发送请求前的延时时间 | 0|
| 组包缓存超时 | 返回分包时的分包间隔超时时间 | 1000 |
| 默认解析顺序 | 4个字节以上的数据解析可设置为ABCD/BADC/CDBA/DCBA,默认ABCD , **变量可单独配置**|ABCDBig-Endian<br></br>BADCBig-Endian Byte Swap<br></br>CDABLittle-Endian Byte Swap<br></br>DCBALittle-Endian |
| 离线重试间隔 | 设备检测到离线时,重新连接的间隔时间(秒) | 30 |
| 失败重试次数 | 读取失败时重试n次后判定变量为离线 | 3 |
## 三、变量地址配置项
- 1、基本地址
| 地址 | 说明 |
| ---------------| --------------------------|
| Txxxxx | Timer寄存器,例如T100/T100.1 |
| Cxxxxx | Counter寄存器,例如C100/C100.1 |
| AIxxxxx | AI寄存器,例如AI100/AI100.1 |
| AQxxxxx | AQ寄存器,例如AQ100/AQ100.1 |
| Ixxxxx | I寄存器,例如I100/I100.1 |
| Qxxxxx | Q寄存器,例如Q100/Q100.1 |
| Mxxxxx | M寄存器,例如M100/M100.1 |
| DBxxxxx | DB寄存器,例如DB100.1/DB100.1.1 |

View File

@@ -1,51 +0,0 @@
---
id: 204
title: OpcDaMaster
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `OPCDA驱动注意`
使用OPCDA插件时需安装[OPC核心库](https://gitee.com/diego2098/ThingsGateway/attach_files)
:::
:::tip `提示`
可以通过调试页面,导出/导入OPC节点到网关
:::
## 一、说明
OpcDaMaster作为主站主动采集OPCDA协议的设备
插件支持远程OPCDA但需要配置DCOM相关知识请自行查阅资料
通道只支持 Other 类型
## 二、插件属性配置项
<img src={require("@site/static/img/docs/OpcDaMaster.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| IP | 连接IP | localhost|
| Opc名称 | OPC名称可识别ProgID或CLSID | Kepware.KEPServerEX.V6|
| 激活订阅 | 是否采用OPC订阅方式读取变量 | True|
| 检查重连频率 | 每隔设定时间获取一次服务器状态,并尝试重新连接(min) |10|
| 死区 | OPC死区 | 0|
| 最大组大小 | 每隔设定大小分一个OPCGroup | 500|
| 更新频率 | 订阅更新频率或者连读频率 (ms) | 1000 |
| 离线重试间隔 | 设备检测到离线时,重新连接的间隔时间(秒) ,只适用于非订阅模式 | 30 |
| 失败重试次数 | 读取失败时重试n次后判定变量为离线 ,只适用于非订阅模式 | 3 |
## 三、变量地址配置项
- 变量地址即为 OPC ItemID

View File

@@ -1,53 +0,0 @@
---
id: 205
title: OpcUaMaster
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
可以通过调试页面,导出/导入OPC节点到网关
:::
## 一、说明
插件支持OPCUA扩展类型自定义类型等等最终体现为json格式
通道只支持 Other 类型
## 二、插件属性配置项
<img src={require("@site/static/img/docs/OpcUaMaster.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| OPCURL | OPCUA URL | opc.tcp://127.0.0.1:49320|
| 登录账号 | 为空时采用匿名方式登录 | |
| 登录密码 | | |
| 检查域 | 是否检查域 | Flase|
| 安全策略 | 是否安全认证/证书方式登录 | True|
| 使用SourceTime | 是否采用服务端的变量时间 | True|
| 加载服务端数据类型 | 是否加载服务端的数据类型对应OPCUA自定义类型必须为true | True|
| 激活订阅 | 是否采用OPC订阅方式读取变量 | True|
| 更新频率 | 订阅更新频率或者连读频率 | 1000 |
| 死区 | OPC死区 | 0|
| 最大组大小 | 每隔设定大小分一个OPCGroup | 500|
| 心跳频率 | |3000|
| 离线重试间隔 | 设备检测到离线时,重新连接的间隔时间(秒) ,只适用于非订阅模式 | 30 |
| 失败重试次数 | 读取失败时重试n次后判定变量为离线 ,只适用于非订阅模式 | 3 |
## 三、变量地址配置项
- 变量地址即为 OPC NodeId
## 四、证书说明
证书可以在软件目录\OPCUAClientCertificate下查看或者导出/复制
<img src={require("@site/static/img/docs/OpcUaMaster1.png").default} />

View File

@@ -1,24 +0,0 @@
---
id: 206
title: VariableExpression
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
VariableExpression不与工业设备交互实际上是一个不依赖采集的表达式脚本计算方法
如果不填写变量表达式,变量值会自增
有关变量表达式的说明,请查看[变量表达式](./104.mdx#变量基础属性配置项)
## 二、插件属性配置项
## 三、变量地址配置项

View File

@@ -1,134 +0,0 @@
---
id: 3
title: 入门指南
slug: /
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip 提示
如果你的开发机不是**Windows**系统在解决方案中可能存在一些vs生成事件脚本(目录拷贝等不支持),会提示编译失败,请删除.csproj文件中的对应事件手动拷贝插件类库
:::
## 一、说明
**ThingsGateway** 基于NET6、8,默认开发IDE为VS2022(**17.8版本以上**),安装VS时需勾选ASP.NET类别.
<img src={require("@site/static/img/docs/vs2022install.png").default} />
## 二、下载源码
[最新版本](https://gitee.com/diego2098/ThingsGateway)
## 三、编译运行
下面我们将以vs2022作为示例
:::tip 提示
**注意需要编译解决方案,因为插件与主体没有引用关系**
:::
1、 vs2022打开解决方案编译解决方案
<img src={require("@site/static/img/docs/生成解决方案.png").default} />
2、 设置ThingsGateway.Server为启动项目开始调试或开始执行
<img src={require("@site/static/img/docs/设置启动项目.png").default} />
<img src={require("@site/static/img/docs/开始执行.png").default} />
3、 启动后会显示登录界面
<img src={require("@site/static/img/docs/login.png").default} />
恭喜你体验了软件的启动第一步!
:::tip 提示
测试环境下,账密会自动填充为超级管理员账号,默认账户:**SuperAdmin**,密码:**111111**
:::
## 四、建立一个完整的流程
下面举例说明 采集ModbusTcp设备中的寄存器通过MqttServer发布 的具体流程
### 1、建立通道
<img src={require("@site/static/img/docs/添加通道.png").default} />
添加tcpClient通道
<img src={require("@site/static/img/docs/通道配置1.png").default} />
添加mqttClient通道选择other即可
<img src={require("@site/static/img/docs/通道配置2.png").default} />
### 2、建立采集设备
添加采集设备选择tcpClient通道modbusTcp驱动
<img src={require("@site/static/img/docs/采集设备1.png").default} />
<img src={require("@site/static/img/docs/采集设备2.png").default} />
### 3、建立业务设备
添加业务设备选择mqttClient通道mqttClient驱动插件属性中填入第三方MqttBroker的连接信息
<img src={require("@site/static/img/docs/业务设备1.png").default} />
<img src={require("@site/static/img/docs/业务设备2.png").default} />
### 4、建立变量
添加变量选择modbusTcp设备填写变量寄存器地址
<img src={require("@site/static/img/docs/变量1.png").default} />
<img src={require("@site/static/img/docs/变量2.png").default} />
### 5、验证
经过以上的配置已经可以从127.0.0.1:502的模拟Modbus设备中采集到PLC地址(400001)并通过网关的mqttClient插件发布到第三方mqttBroker
。下面来验证一下
首先先启动模拟的modbusSlave软件
<img src={require("@site/static/img/docs/modbus模拟软件.png").default} />
然后重启网关后台服务,注意并不是需要重新启动软件进程,
而是**重新加载网关的组态配置到运行态中**,通过**网页右下角的重启运行时按钮**进行操作
<img src={require("@site/static/img/docs/重启后台.png").default} />
跳转到网关的运行状态查看
<img src={require("@site/static/img/docs/运行状态.png").default} />
开启调试日志的话可以看到每次交互的modbus报文以及结果状态
采集的数据点位值与相关信息跳转到实时数据页面
<img src={require("@site/static/img/docs/实时数据.png").default} />
可以看到值与采集时间等等的变化注意这里的页面实时值变化是1s的间隔时间如果配置了采集间隔小于1s页面刷新不及时是正常的不影响业务上传
MqttClient的日志也可以在运行状态中看到
<img src={require("@site/static/img/docs/运行状态1.png").default} />
## 五、详细说明
:::tip 提示
在查看案例前,请先查看**关于网关的基础内容**
:::
- [文档](https://diego2098.gitee.io/thingsgateway-docs)
- [博客](https://www.cnblogs.com/ThingsGateway/collections/1104)
- [视频](https://space.bilibili.com/88105259/channel/series)

View File

@@ -1,31 +0,0 @@
---
id: 30001
title: 串口
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
### 前言
串口使用一个称为串行通信协议的协议来管理数据传输。串行通信协议在数据传输期间控制数据流,包括起始位、数据位、波特率、校验位和停止位等。
下面每个名称做一个简单的解释。
``波特率``是指串口通信中每秒传输的二进制位数
``起始位``是1位时间、值为0的位。
``数据位``通常可能为1位、1.5位、2位时间。
``校验位``是1位时间根据校验方式确定验证值比如奇校验时计算数据位中的值为1的个数如果是奇数则为1否则应为0
``停止位``通常可能为1位、1.5位、2位时间。停止位是值为1的位。停止位代表着数据传输结束。
线路路空闲或者数据传输结束时值总是1。
对于正逻辑的TTL电平值为1是高电平对于负逻辑(如RS-232电平)则相反。
单看文字很难理解具体含义,所以我们看图说话,下面这张串口示波器图清晰的表现出二进制的传输原理
<img src={require("@site/static/img/docs/串口1.png").default} />
如上图可以看出2进制是 起始``1``、数据(右到左)``01010101``、停止``0`` ,那么解析出来的数据就是``0x55``
看到这里相信大家都对串口知识有了一定的理解这些基础知识对于c#工程师看似没有必要,但可以让你的实际调试开发工作更加得心应手

View File

@@ -1,287 +0,0 @@
---
id: 301
title: MqttClient
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
通过自定义脚本可快速适配业务模型比如各大云平台的Iot物模型
脚本的示例请查看**常见问题**
:::
## 一、说明
MqttClient通过Tcp/WebSocket的方式发布内容到Broker(Server),可以定时/变化发布数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/MqttClient.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| IP | ServerIP,为空时指任意IP | |
| 端口 | 连接端口 | 1883|
| 是否WebSocket连接 | 是否WebSocket连接 | False |
| WebSocketUrl | WebSocketUrl | ws://127.0.0.1:8083/mqtt |
| 账号 | 账号 | |
| 密码 | 密码 | |
| 连接Id | 连接Id | |
| 连接超时时间 | 连接超时时间 | |
| 允许Rpc写入 | 是否允许写入变量 | |
| Rpc写入Topic | 写入变量的主题 | 实际的写入主题为固定通配 {RpcWrite/+} 其中RpcWrite为该属性填入内容+通配符是请求GUID值返回结果主题会在主题后添加Response , 也就是{RpcWrite/+/Response} |
| 数据请求Topic | 该主题接受到任何消息都会发布全部信息到对应的变量/设备/报警主题中 | |
| 设备是否列表 | 设备是否列表上传false时每个设备实体都会单独发布注意性能需求默认为true | |
| 变量是否列表 | 变量是否列表上传false时每个变量实体都会单独发布注意性能需求默认为true | |
| 报警是否列表 | 报警是否列表上传false时每个报警实体都会单独发布注意性能需求默认为true | |
| 设备Topic | 设备实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 变量Topic | 变量实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 报警Topic | 报警实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 设备实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**DeviceData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 变量实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**VariableData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 报警实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**AlarmVariable**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |
### 脚本接口
```
public interface IDynamicModel
{
IEnumerable<dynamic> GetList(IEnumerable<dynamic> datas);
}
```
### DeviceData
```
/// <summary>
/// 设备业务变化数据
/// </summary>
public class DeviceData
{
/// <inheritdoc cref="PrimaryIdEntity.Id"/>
public long Id { get; set; }
/// <inheritdoc cref="Device.Name"/>
public string Name { get; set; }
/// <inheritdoc cref="DeviceRunTime.ActiveTime"/>
public DateTime ActiveTime { get; set; }
/// <inheritdoc cref="DeviceRunTime.DeviceStatus"/>
public DeviceStatusEnum DeviceStatus { get; set; }
/// <inheritdoc cref="DeviceRunTime.LastErrorMessage"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string LastErrorMessage { get; set; }
/// <inheritdoc cref="Device.Remark1"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark1 { get; set; }
/// <inheritdoc cref="Device.Remark2"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark2 { get; set; }
/// <inheritdoc cref="Device.Remark3"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark3 { get; set; }
/// <inheritdoc cref="Device.Remark4"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark4 { get; set; }
/// <inheritdoc cref="Device.Remark5"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark5 { get; set; }
}
```
### VariableData
```
/// <summary>
/// 变量业务变化数据
/// </summary>
public class VariableData
{
/// <inheritdoc cref="PrimaryIdEntity.Id"/>
public long Id { get; set; }
/// <inheritdoc cref="Variable.Name"/>
public string Name { get; set; }
/// <inheritdoc cref="VariableRunTime.DeviceName"/>
public string DeviceName { get; set; }
/// <inheritdoc cref="VariableRunTime.Value"/>
public object Value { get; set; }
/// <inheritdoc cref="VariableRunTime.ChangeTime"/>
public DateTime ChangeTime { get; set; }
/// <inheritdoc cref="VariableRunTime.CollectTime"/>
public DateTime CollectTime { get; set; }
/// <inheritdoc cref="VariableRunTime.IsOnline"/>
public bool IsOnline { get; set; }
/// <inheritdoc cref="VariableRunTime.LastErrorMessage"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string? LastErrorMessage { get; set; }
/// <inheritdoc cref="Device.Remark1"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark1 { get; set; }
/// <inheritdoc cref="Device.Remark2"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark2 { get; set; }
/// <inheritdoc cref="Device.Remark3"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark3 { get; set; }
/// <inheritdoc cref="Device.Remark4"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark4 { get; set; }
/// <inheritdoc cref="Device.Remark5"/>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark5 { get; set; }
}
```
### AlarmVariable
```
/// <summary>
/// 报警变量
/// </summary>
public class AlarmVariable
{
/// <inheritdoc cref="Variable.Name"/>
[SugarColumn(ColumnDescription = "变量名称", IsNullable = false)]
public string Name { get; set; }
/// <inheritdoc cref="Variable.Description"/>
[SugarColumn(ColumnDescription = "描述", IsNullable = true)]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string? Description { get; set; }
/// <inheritdoc cref="VariableRunTime.DeviceName"/>
[SugarColumn(ColumnDescription = "设备名称", IsNullable = true)]
public string DeviceName { get; set; }
/// <inheritdoc cref="Variable.RegisterAddress"/>
[SugarColumn(ColumnDescription = "变量地址")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string RegisterAddress { get; set; }
/// <inheritdoc cref="Variable.DataType"/>
[SugarColumn(ColumnDescription = "数据类型", ColumnDataType = "varchar(100)")]
public DataTypeEnum DataType { get; set; }
/// <inheritdoc cref="VariableRunTime.AlarmCode"/>
[SugarColumn(ColumnDescription = "报警值", IsNullable = false)]
public string AlarmCode { get; set; }
/// <inheritdoc cref="VariableRunTime.AlarmLimit"/>
[SugarColumn(ColumnDescription = "报警限值", IsNullable = false)]
public string AlarmLimit { get; set; }
/// <inheritdoc cref="VariableRunTime.AlarmText"/>
[SugarColumn(ColumnDescription = "报警文本", IsNullable = true)]
public string? AlarmText { get; set; }
/// <inheritdoc cref="VariableRunTime.AlarmTime"/>
[SugarColumn(ColumnDescription = "报警时间", IsNullable = false)]
public DateTime AlarmTime { get; set; }
/// <inheritdoc cref="VariableRunTime.EventTime"/>
public DateTime EventTime { get; set; }
/// <summary>
/// 报警类型
/// </summary>
public AlarmTypeEnum? AlarmType { get; set; }
/// <summary>
/// 事件类型
/// </summary>
public EventTypeEnum EventType { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark1 { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark2 { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark3 { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark4 { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Remark5 { get; set; }
}
```
## 三、变量业务属性
### 允许写入
单独配置变量是否允许写入
## 四、Rpc
### 1、请求内容
MqttRpc的请求内容与WebApi一致请求参数为Dictionary<string, string>,比如
```
{
"D500":"1"
}
```
键为变量名称,值为写入参数值
### 2、请求主题
请求主题在配置属性中设置,查看**Rpc写入Topic**
注意,实际的请求主题为 `{ThingsGateway.Rpc/[自定义GUID或者雪花ID]/[Rpc写入Topic]}`
### 3、Rpc返回主题
`{ThingsGateway.Rpc/[自定义GUID或者雪花ID]/[Rpc写入Topic]/Response}`
### 4、图示
<img src={require("@site/static/img/docs/MqttRpc.png").default} />

View File

@@ -1,74 +0,0 @@
---
id: 302
title: MqttServer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
通过自定义脚本,可快速适配业务模型
脚本的示例请查看**常见问题**
:::
:::tip `权限注意`
Server的连接权限除了Id前缀限制外账号密码同样要求在网关后台创建的所有账号密码都可以登录MqttServer
:::
## 一、说明
MqttServer支持Tcp/webSocket方式接入可以定时/变化发布数据支持Rpc写入
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/MqttServer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| IP | ServerIP,为空时指任意IP | |
| 端口 | Tcp绑定端口 | 1883|
| WebSocket端口 | WebSocket绑定端口 | 8083固定/mqtt路由 |
| 允许连接的ID(前缀) | 允许连接的ID(前缀) |ClientId必须以这个属性开头 |
| 允许Rpc写入 | 是否允许写入变量 | |
| Rpc写入Topic | 写入变量的主题 | 实际的写入主题为固定通配 {RpcWrite/+} 其中RpcWrite为该属性填入内容+通配符是请求GUID值返回结果主题会在主题后添加Response , 也就是{RpcWrite/+/Response} |
| 设备是否列表 | 设备是否列表上传false时每个设备实体都会单独发布注意性能需求默认为true | |
| 变量是否列表 | 变量是否列表上传false时每个变量实体都会单独发布注意性能需求默认为true | |
| 报警是否列表 | 报警是否列表上传false时每个报警实体都会单独发布注意性能需求默认为true | |
| 设备Topic | 设备实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 变量Topic | 变量实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 报警Topic | 报警实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 设备实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**DeviceData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 变量实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**VariableData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 报警实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**AlarmVariable**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |
### 脚本与实体
查看MqttClient页面[脚本接口](./301.mdx#脚本接口)
## 三、变量业务属性
### 允许写入
单独配置变量是否允许写入
## 四、Rpc
查看MqttClient页面[Rpc](./301.mdx#四rpc)

View File

@@ -1,58 +0,0 @@
---
id: 303
title: RabbitMQProducer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
通过自定义脚本,可快速适配业务模型
脚本的示例请查看**常见问题**
:::
## 一、说明
RabbitMQProducer适配RabbitMQ协议主动发布内容到服务端可以定时/变化发布数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/RabbitMQProducer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| IP | ServerIP,为空时指任意IP | |
| 端口 | 连接端口 | |
| 账号 | 账号 | |
| 密码 | 密码 | |
| 是否声明队列 | 初始化时是否自动创建队列 | |
| 虚拟Host | / | |
| 交换机名称 | 交换机名称 | |
| 设备是否列表 | 设备是否列表上传false时每个设备实体都会单独发布注意性能需求默认为true | |
| 变量是否列表 | 变量是否列表上传false时每个变量实体都会单独发布注意性能需求默认为true | |
| 报警是否列表 | 报警是否列表上传false时每个报警实体都会单独发布注意性能需求默认为true | |
| 设备Topic | 设备实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 变量Topic | 变量实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 报警Topic | 报警实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 设备实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**DeviceData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 变量实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**VariableData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 报警实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**AlarmVariable**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |
### 脚本与实体
查看MqttClient页面[脚本接口](./301.mdx#脚本接口)

View File

@@ -1,77 +0,0 @@
---
id: 304
title: KafkaProducer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
通过自定义脚本,可快速适配业务模型
脚本的示例请查看**常见问题**
:::
:::tip `须知`
插件使用**librdkafka**,注意按需安装c库
On Mac OSX, install librdkafka with homebrew:
```
$ brew install librdkafka
```
On Debian and Ubuntu, install librdkafka from the Confluent APT repositories, see instructions here and then install librdkafka:
```
$ apt install librdkafka-dev
```
On RedHat, CentOS, Fedora, install librdkafka from the Confluent YUM repositories, instructions here and then install librdkafka:
```
$ yum install librdkafka-devel
```
For other platforms, follow the source building instructions below.
:::
## 一、说明
KafkaProducer适配Kafka协议主动发布内容到服务端可以定时/变化发布数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/KafkaProducer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 服务地址 | 服务地址 | 127.0.0.1:9092|
| 发布超时时间 | 发布超时时间 |5000 |
| 用户名 | 用户名 | |
| 密码 | 密码 | |
| SecurityProtocol | SecurityProtocol | |
| SaslMechanism | SaslMechanism | |
| 设备是否列表 | 设备是否列表上传false时每个设备实体都会单独发布注意性能需求默认为true | |
| 变量是否列表 | 变量是否列表上传false时每个变量实体都会单独发布注意性能需求默认为true | |
| 报警是否列表 | 报警是否列表上传false时每个报警实体都会单独发布注意性能需求默认为true | |
| 设备Topic | 设备实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 变量Topic | 变量实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 报警Topic | 报警实体的发布主题 ,使用${key}作为匹配项key必须是上传实体中的属性 | |
| 设备实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**DeviceData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 变量实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**VariableData**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 报警实体脚本 | 脚本返回新的实体列表,动态类中需继承**IDynamicModel**,传入列表为**AlarmVariable**,查看以下具体属性 | 编辑页面中,可通过检查按钮验证脚本,脚本示例请查看**常见问题** |
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |
### 脚本与实体
查看MqttClient页面[脚本接口](./301.mdx#脚本接口)

View File

@@ -1,34 +0,0 @@
---
id: 305
title: TDengineDBProducer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
TDengineDBProducer适配TDengineDB时序数据库可以定时/变化存储变量数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/TDengineDBProducer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 链接字符串 | 链接字符串 | Host=localhost;Port=6030;Username=root;Password=taosdata;Database=test|
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |

View File

@@ -1,34 +0,0 @@
---
id: 306
title: QuestDBProducer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
QuestDBProducer适配QuestDB时序数据库可以定时/变化存储变量数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/QuestDBProducer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 链接字符串 | 链接字符串 | host=localhost;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;|
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |

View File

@@ -1,38 +0,0 @@
---
id: 307
title: SqlDBProducer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
SqlDBProducer适配关系数据库可以定时/变化存储变量数据,也可以实时更新数据到实时表
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/SqlDBProducer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 是否实时表 | 开启实时更新数据功能 | |
| 是否历史表 | 开始历史存储功能 |true |
| 实时表名称 | 实时表名称 | |
| 数据库类型 | 数据库类型 | |
| 链接字符串 | 链接字符串 | server=.;uid=sa;pwd=111111;database=test;|
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 是否间隔执行 | 是否选择全部变量true间隔上传False变化检测上传 | |
| 间隔执行时间 | 间隔执行时间 | |
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |

View File

@@ -1,32 +0,0 @@
---
id: 308
title: SqlHisAlarm
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、说明
SqlHisAlarm适配关系数据库可以变化存储变量报警数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/SqlHisAlarm.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 数据库类型 | 数据库类型 | |
| 链接字符串 | 链接字符串 | server=.;uid=sa;pwd=111111;database=test;|
| 启用缓存 | 是否启用缓存 | |
| 上传列表最大数量 | 每一次上传的列表最大数量 | |
| 内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |

View File

@@ -1,53 +0,0 @@
---
id: 309
title: OpcUaServer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `权限注意`
如果开启安全策略在网关后台创建的所有账号密码都可以登录OpcUaServer
如果不开启安全策略,则可以匿名登录
:::
## 一、说明
OpcUaServer支持外部OpcUa客户端读写
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/OpcUaServer.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 是否选择全部变量 | 是否选择全部变量true时不需要单个变量添加业务属性 | |
| 服务地址 | Url ,以分号分割,可设置多个 | opc.tcp://127.0.0.1:49321 |
| SubjectName | 证书内容 | |
| 安全策略 | 启用后将不接受使用匿名登录的客户端,并且可以写入变量 | |
| 自动接受不受信任的证书 | 自动获取客户端证书并接受 | True |
## 三、变量业务属性
### 数据类型
同变量管理数据类型Enum
## 四、证书说明
证书可以在软件目录\OPCUAServerCertificate下查看或者导出/复制
<img src={require("@site/static/img/docs/OpcUaServer1.png").default} />

View File

@@ -1,31 +0,0 @@
---
id: 400
title: 发布
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、编译解决方案
<img src={require("@site/static/img/docs/发布.png").default} />
选择Release , 点击解决方案全编译(或者编译plugin文件夹)
## 二、发布版本
<img src={require("@site/static/img/docs/发布1.png").default} />
按需选择发布版本(图中为linux-64 net6)
## 三、复制插件文件夹
:::tip `提示`
如果你的开发机是**Windows**系统,这一步不再需求进行,发布时通过脚本已经自动复制到发布文件夹
:::
<img src={require("@site/static/img/docs/发布2.png").default} />

View File

@@ -1,37 +0,0 @@
---
id: 401
title: Windows部署
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
如果需要Runtime依赖部署需要安装ASP.NET Core Runtime如果是独立发布部署则不需要安装Runtime
下载链接:https://dotnet.microsoft.com/zh-cn/download/dotnet
:::
遵循windows service服务安装/启动/停止方式 https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/sc-create
提供懒人bat脚本文件管理员身份运行**WindowsServiceCreate.bat**
<img src={require("@site/static/img/docs/Windows服务.png").default} />
运行脚本后可以在windows服务中找到**ThingsGateway**
<img src={require("@site/static/img/docs/Windows服务1.png").default} />
如需删除服务,运行**WindowsServiceDelete.bat**

View File

@@ -1,195 +0,0 @@
---
id: 402
title: IIS部署
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::caution 注意
1、必须启用IIS WebSocket协议
2、禁用IIS回收
:::
:::tip `提示`
如果需要Runtime依赖部署需要安装ASP.NET Core Runtime如果是独立发布部署则不需要安装Runtime
下载链接:https://dotnet.microsoft.com/zh-cn/download/dotnet
:::
:::tip 精简发布文件
如果需要精简发布后的文件,也就是删除不必要的文件夹,可以编辑 Web 项目的 `.csproj` 并添加 `<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>`,如:
```cs showLineNumbers {3}
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
</PropertyGroup>
```
若无需生成 `.pdb` 文件,可以继续添加:
```cs showLineNumbers {2-3}
<PropertyGroup>
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
```
:::
## 服务器环境配置
### 第一步
安装.NET Core 运行时捆绑包:[点击下载](https://dotnet.microsoft.com/permalink/dotnetcore-current-windows-runtime-bundle-installer)
### 第二步(命令)
```bash showLineNumbers
net stop was /y
```
### 第三步(命令)
```bash showLineNumbers
net start w3svc
```
### 第四步(命令)
```bash showLineNumbers
set ASPNETCORE_ENVIRONMENT=Production
```
## 部署到 IIS
### 添加新网站
<img src={require("@site/static/img/furion/ds1.png").default} />
### 配置网站信息
<img src={require("@site/static/img/furion/ds2.png").default} />
### 34.1.3.3 配置应用程序池
<img src={require("@site/static/img/furion/ds3.png").default} />
### 34.1.3.4 设置为 `非托管`
<img src={require("@site/static/img/furion/ds4.png").default} />
### 34.1.3.5 重启网站
只需重启网站或应用程序池即可。
## 34.1.4 常见问题
### 34.1.4.1 405 状态码,不支持 `PUTDELETE` 请求
默认情况下,`IIS`拒绝 `PUT`和 `DELETE` 请求,原因为 `IIS` 默认注册了一个名为 `WebDAVModule` 的自定义 `HttpModule` 导致的。
解决该问题,只需要在 `web.config` 移除即可:
```xml {2-6}
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="webDAVModule"/>
</modules>
</system.webServer>
</configuration>
```
微软官方文档:[https://docs.microsoft.com/zh-cn/troubleshoot/developer/webapps/iis/health-diagnostic-performance/http-error-405-website](https://docs.microsoft.com/zh-cn/troubleshoot/developer/webapps/iis/health-diagnostic-performance/http-error-405-website)
<img src={require("@site/static/img/furion/iis5.png").default} />
### 34.1.4.2 `WebSocket`/ `SignalR` 连接报错
如果项目部署在 `IIS` 中出现 `WebSoket`/`SignalR` 不能连接或连接失败等问题,请确保 `IIS` 服务中的 `WebSocket 协议` 是勾选状态
<img src={require("@site/static/img/furion/iis2.png").default} />
### 34.1.4.3 部署之后缺失 `api-ms-win.xxxx.dll` 问题
有时候将发布文件发布到服务器后,出现丢失 `api.ms-win.xxxx.dll` 文件,这时只需要重新发布并选择服务器特定的架构即可。
<img src={require("@site/static/img/furion/iis4.jpg").default} />
<img src={require("@site/static/img/furion/iis3.png").default} />
## 34.1.5 `IIS` 回收问题和配置
通过 `IIS` 部署 `.NET Core` 应用程序,如果启动了系统日志,就会发现经常出现 `Application is shutting down...` 的日志,代表 `IIS` 回收了应用程序池。
对于一个长期在线的网站来说,这是非常不合理的,所以我们可以通过以下配置让 `IIS` 进行长时间不访问便回收的机制。
---
配置步骤如下:
1. 打开 `IIS` 并点击左侧树根节点(计算机名称)并点击右侧的 `Configuration Editor`(配置编辑器)
<img src={require("@site/static/img/furion/iis6.png").default} />
2. 在 `Section`(节)选择 `system.applicationHost/applicationPools` 并设置 `startMode` 为 `AlwaysRunning`,之后点击 `Apply` 保存。
<img src={require("@site/static/img/furion/iis7.png").default} />
3. 点击左侧树根节点(计算机名称)下的 `Application Pools` 并点击最右侧的 `Set Appliation Pool Defaults...`(设置应用程序池默认配置...
<img src={require("@site/static/img/furion/iis8.png").default} />
4. 设置 `Idle Time-out (minutes)`(闲置超时(分钟)为 `0`
<img src={require("@site/static/img/furion/iis9.png").default} />
这样即可解决 `IIS` 回收问题。
## 34.1.6 卷影(无占用)复制发布替换
正常情况下如果我们代码重新发布后替换 `IIS` 中的文件,这时候会出现文件占用无法进行替换,过去运维人员都是先停止站点后替换再启动。但我们也可以配置 `web.config` 文件启用卷影复制模式实现类似**热更新**操作,如:
```xml showLineNumbers {12-18}
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- To customize the asp.net core module uncomment and edit the following section.
For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
<system.webServer>
<handlers>
<remove name="aspNetCore"/>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModulev2" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
<handlerSettings>
<handlerSetting name="experimentalEnableShadowCopy" value="true" />
<handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
<!-- Only enable handler logging if you encounter issues-->
<!--<handlerSetting name="debugFile" value=".\logs\aspnetcore-debug.log" />-->
<!--<handlerSetting name="debugLevel" value="FILE,TRACE" />-->
</handlerSettings>
</aspNetCore>
</system.webServer>
</configuration>
```
关于卷影复制更多知识可查看以下文档:
- [https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-net-6-preview-3/#shadow-copying-in-iis](https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-net-6-preview-3/#shadow-copying-in-iis)
- [https://learn.microsoft.com/zh-cn/dotnet/framework/app-domains/shadow-copy-assemblies](https://learn.microsoft.com/zh-cn/dotnet/framework/app-domains/shadow-copy-assemblies)

View File

@@ -1,122 +0,0 @@
---
id: 403
title: Docker部署
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::important 特别注意
验证码使用SkiaSharp如果是在 linux 服务下运行则需要安装 libfontconfig1如 ubuntu 的安装命令
```
apt-get update
apt-get -y install libfontconfig1
```
如果是采用 docker 模式运行,则需要在 dockerfile 中添加如下配置,该命令适用于 debian 和 ubuntu 的 docker
```
RUN apt-get update && apt-get -y install libfontconfig1
```
:::
:::tip `提示`
如果需要Runtime依赖部署需要安装ASP.NET Core Runtime如果是独立发布部署则不需要安装Runtime
下载链接:https://dotnet.microsoft.com/zh-cn/download/dotnet
:::
:::tip 精简发布文件
如果需要精简发布后的文件,也就是删除不必要的文件夹,可以编辑 Web 项目的 `.csproj` 并添加 `<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>`,如:
```cs showLineNumbers {3}
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
</PropertyGroup>
```
若无需生成 `.pdb` 文件,可以继续添加:
```cs showLineNumbers {2-3}
<PropertyGroup>
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
```
:::
## 34.2.1 关于 `Docker` 部署
在 `Docker` 中部署网站有两种方式:
- `发布后构建`:此方式是先发布网站后在再构建镜像,这样可以减少不必要的构建层,而且还能缩减镜像大小。**(推荐)**
- `编译+构建+发布`:也就是说在 `Dockerfile` 中配置网站从构建到发布的完整过程,此方式会速度慢,而且会产生冗余层,增加镜像大小。
## 34.2.2 两种方式构建
### 34.2.2.1 发布后构建
- 👉 编写 `Dockerfile`
```
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
COPY . /app
WORKDIR /app
EXPOSE 80
#linux安装
RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ sid main contrib non-free" > /etc/apt/sources.list
RUN apt-get update && apt-get -y install libfontconfig1
ENTRYPOINT ["dotnet", "ThingsGateway.Web.Server.dll","--urls","http://*:7200"]
```
- 👉 将 `Dockerfile` 文件拷贝到发布根目录
将编写好的 `Dockerfile` 文件(注意 `D` 大写)拷贝到发布网站的根目录下。
:::tip `提示`
git仓库中已经包含 `Dockerfile` 文件
:::
- 👉 构建 `Docker` 镜像
在网站发布后的路径根目录下(必须含 `Dockerfile`)打开 `CMD/PowerShell` 只需构建命令:
```bash showLineNumbers
docker build -t 网站名称:网站版本号 .
```
:::important 特别注意
后端的 `.` 不能省略
:::
- 👉 启动镜像
```bash showLineNumbers
docker run --name 容器名称 -p 5000:80 --restart=always -d 网站名称:网站版本号
```
:::caution `.NET8` 中 `80` 端口问题
在使用 `.NET8`,默认的端口由原来的 `80` 端口变成了 `8080`。[查看相关说明](https://learn.microsoft.com/zh-cn/dotnet/core/compatibility/containers/8.0/aspnet-port)
:::
- 👉 在 `Dockerfile` 所在路径构建
接下来的步骤和上述步骤一致,不再重复编写。

View File

@@ -1,55 +0,0 @@
---
id: 404
title: Linux服务部署
---
:::important 特别注意
验证码使用SkiaSharp如果是在 linux 服务下运行则需要安装 libfontconfig1如 ubuntu 的安装命令
```
apt-get update
apt-get -y install libfontconfig1
```
如果是采用 docker 模式运行,则需要在 dockerfile 中添加如下配置,该命令适用于 debian 和 ubuntu 的 docker
```
RUN apt-get update && apt-get -y install libfontconfig1
```
:::
### PM2守护
详细安装请自行查找资料
查阅详细官方文档 https://pm2.keymetrics.io/docs/usage/quick-start/
下面介绍一下常用指令
- 安装pm2
```
npm install pm2@latest -g
```
- 启用应用程序
```
pm2 start pm2-linux.json
```
- 停止应用程序
```
pm2 stop pm2-linux.json
```
- 自动启动
```
pm2-startup
pm2 save
```
### linux服务
自行查询相关资料 **NetCore/Linux/Systemd**

View File

@@ -1,47 +0,0 @@
---
id: 501
title: 常见问题
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
#### 1、Modbus地址可以只写地址0吗一定要写成类似400001?
按照PLC Modbus寄存器的格式以区域号为起始字符后续加上寄存器地址+1
所以一定要写成400001
#### 2、数据如何设置小数位
网关提供灵活的脚本式配置转换,可以在变量的读取表达式中进行配置转换
如果要设置小数位为2可以填入
```
Math.Round(raw.ToDecimal(), 2)
```
#### 3、源码打开razor文件时不出现智能提示有waring警告(波浪线)
VS的bug导致的可以尝试升级vs把工程目录下的.vs文件夹已经全部的bin OR obj 删除后,重新打开解决方案
#### 4、报警属性中的报警约束如何定义
报警约束和变量表达式类似填入脚本返回值为true时报警生效
```csharp
//新建testInt1,testInt2两个变量
//在testInt1的高高报警值为1开启使能
//在testInt1的高高报警约束中定义testInt2>10
//testInt1为8,testInt2为11时产生testInt1报警
//testInt1为8,testInt2为10时不会产生testInt1报警
```
#### 5、启动项目之后驱动调试页面没有任何信息设备选择插件时也不出现任何选择项
网关插件未编译,需要编译解决方案,查看入门指南;或者插件未能成功拷贝到插件目录(Plugins)

View File

@@ -1,118 +0,0 @@
---
id: 502
title: 脚本常见问题
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 一、脚本示例
```
//变量脚本动态设置传输实体的Demo
//只传输变量名称,变量值,变量在线状态,变量值改变时间
public class DemoScript:IDynamicModel
{
public IEnumerable<dynamic> GetList(IEnumerable<object> datas)
{
List<DemoData> demoDatas = new List<DemoData>();
foreach (var v in datas)
{
var data=(VariableData)v;
DemoData demoData = new DemoData();
demoData.Value = data.Value;
demoData.Name = data.Name;
demoData.IsOnline = data.IsOnline;
demoData.ChangeTime = data.ChangeTime;
demoDatas.Add(demoData);
}
return demoDatas;
}
}
public class DemoData
{
public string Name { get; set; }
public bool IsOnline { get; set; }
public object Value { get; set; }
public DateTime ChangeTime { get; set; }
}
```
## 二、适配阿里云物模型脚本
对应文档:[阿里云设备属性上报](https://help.aliyun.com/zh/iot/user-guide/data-formats?spm=a2c4g.11186623.0.i17#section-jrb-lrl-b2b)
### 变量脚本
```
//一个适配阿里云IOT的变量脚本demo
public class AliYunIotScript:IDynamicModel
{
public IEnumerable<dynamic> GetList(IEnumerable<object> datas)
{
List<AliYunIot> aliYunIots = new();
// 对输入列表进行分组,根据 Remark1属性分组
var groups = datas.Where(a => !string.IsNullOrEmpty(((VariableData)a).Remark1)).GroupBy(a => ((VariableData)a).Remark1,a=> ((VariableData)a));
// 遍历每一个分组
foreach (var item in groups)
{
var requestId = Yitter.IdGenerator.YitIdHelper.NextId();
var iotId = item.Key; //Remark1自定义为设备Id
var productKey = item.FirstOrDefault(a => !string.IsNullOrEmpty(a.Remark2))?.Remark2;//Remark2自定义为产品Id
var deviceName = item.FirstOrDefault(a => !string.IsNullOrEmpty(a.Remark3))?.Remark3;//Remark3自定义为设备名称
AliYunIot aliYunIot = new();
aliYunIot.iotId = iotId;
aliYunIot.requestId = requestId.ToString();
aliYunIot.deviceName = deviceName;
aliYunIot.productKey = productKey;
// 遍历分组内的每一个元素
foreach (var varItem in item)
{
// 设置采集时间,并转换为 Unix 时间戳
// 设置值
var data = new Property() { value = varItem.Value, time = new DateTimeOffset(varItem.CollectTime).ToUnixTimeSeconds() };
// 以 变量名称 作为键,将新对象添加到分组的 属性 中
aliYunIot.items.Add(varItem.Name, data);
}
aliYunIots.Add(aliYunIot);
}
return aliYunIots;
}
}
public class AliYunIot
{
public string iotId { get; set; }
public string requestId { get; set; }
public string productKey { get; set; }
public string deviceName { get; set; }
public Dictionary<string, Property> items { get; set; } = new();
}
public class Property
{
public object value { get; set; }
public long time { get; set; }
}
```
### 传输主题
变量Topic 填入 `/${productKey}/${deviceName}/thing/event/property/post`

View File

@@ -1,38 +0,0 @@
---
id: 601
title: 采集插件开发
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## 说明
ThingsGateway封装了丰富的协议解析方法方便开发多种PLC通讯插件
下面我们以Omron FinsTcp/Udp为例讲解如何基于ThingsGateway开发一个**通用驱动**以及ThingsGateway插件
## 一、协议解析
`Fins` 协议是OSI模型第7层上的应用层报文传输协议我们画一个简单的应用层协议报文解析图
| Fins over TCP | Fins over UDP |
| ---------------| --------------------------|
| FinsTCP Header | None |
| FinsUDP Header | FinsUDP Header |
| Command Data |Command Data |
可以看出基于Tcp的Fins和基于Udp的Fins协议差别只是Tcp连接时会加一个FinsTcp报文头。
下面我们进行每个部分的说明
### 1、FinsTCP Header
FinsTcp头部固定为16个字节
| FinsTCP Header | 说明 |
| ---------------| --------------------------|
| Magic | 固定0x46494E53也就是FINS字符串的ASCII码 |
| Length | 后续全部字节的长度 |
| Command | 0是客户端请求握手1是服务端返回握手信息除0,1外是其他方法 |

View File

@@ -1,9 +0,0 @@
---
id: 602
title: 业务插件开发
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';

View File

@@ -1,80 +0,0 @@
---
id: upgrade
title: 更新日志
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
## v5.0.0.1
> 2024-1-21
**更新描述:**
此版本是大版本更新。可能会产生很多不兼容部分,所以升级之前请做好备份。
如果需要从5.0前升级,请按以下操作进行
1、导出旧版本的excel配置文件包括采集设备、上传设备、变量等
2、5.0框架中,只建立一个对应插件的设备/变量这一步是因为插件是按需导出的需要建立对应插件才会导出相应的sheet建好后导出excel
3、参照5.0版本的excel内容把旧版本的配置内容移到新版本excel文件中
4、导入已修改好的5.0版本excel配置文件
**更新详情:**
- &nbsp;<Tag>调整</Tag> 重构采集驱动底层,网关缓存
- &nbsp;<Tag>调整</Tag> 重构网关权限管理框架
- &nbsp;<Tag>调整</Tag> 重构网关线程管理器
- &nbsp;<Tag>调整</Tag> 重构网关断线续传功能
- &nbsp;<Tag>调整</Tag> 重构脚本支持方便对应各大云平台的iot格式
- &nbsp;<Tag>调整</Tag> 调整网关UI外观风格
## v3.0.0.25
- &nbsp;<Tag>调整</Tag> 删除S7插件中的DstTSAP属性,用插槽号与机架号代替,更直观
- &nbsp;<Tag>调整</Tag> OPCUAServer插件 url属性支持多个url以逗号分割
## v3.0.0.19
- &nbsp;<Tag>新增</Tag> 添加TDengineDB时序库上传插件
- &nbsp;<Tag>新增</Tag> 添加QuestDB时序库上传插件
- &nbsp;<Tag>新增</Tag> 添加DLT645采集插件
- &nbsp;<Tag>新增</Tag> 添加调试软件
## v1.7.0
- &nbsp;<Tag>优化</Tag> OPCUAClient支持动态类型
## v1.2.0
- &nbsp;<Tag>新增</Tag> 添加OPCUAServer插件
##
## v1.1.0
- &nbsp;<Tag>新增</Tag> 添加OPCDAClient采集插件
- &nbsp;<Tag>新增</Tag> 添加OPCUAClient采集插件
- &nbsp;<Tag>新增</Tag> 串口基础框架
##
## v1.0.0
- &nbsp;<Tag>新增</Tag> 初始发布
##

22684
doc/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,315 +0,0 @@
module.exports = {
docs: [
{
type: "doc",
id: "upgrade",
label: "更新日志"
},
{
type: "doc",
id: "1",
label: "版权说明"
},
{
type: "doc",
id: "2",
label: "产品介绍"
},
{
type: "doc",
id: "3",
label: "入门指南"
},
{
type: "doc",
id: "100",
label: "驱动调试"
},
{
type: "category",
label: "基础手册",
items: [
{
type: "category",
label: "网关配置",
items: [
{
type: "doc",
id: "101",
label: "插件管理"
},
{
type: "doc",
id: "102",
label: "通道管理"
},
{
type: "doc",
id: "103",
label: "设备"
},
{
type: "doc",
id: "104",
label: "变量"
},
]
},
{
type: "doc",
id: "105",
label: "网关状态查看"
},
{
type: "doc",
id: "106",
label: "网关日志"
},
]
},
{
type: "category",
label: "采集插件手册",
items: [
{
type: "doc",
id: "200",
label: "ModbusMaster"
},
{
type: "doc",
id: "202",
label: "Dlt645Master"
},
{
type: "doc",
id: "203",
label: "SiemensS7Master"
},
{
type: "doc",
id: "204",
label: "OpcDaMaster"
},
{
type: "doc",
id: "205",
label: "OpcUaMaster"
},
{
type: "doc",
id: "206",
label: "VariableExpression"
}
]
},
{
type: "category",
label: "业务插件手册",
items: [
{
type: "doc",
id: "201",
label: "ModbusSlave"
},
{
type: "doc",
id: "301",
label: "MqttClient"
},
{
type: "doc",
id: "302",
label: "MqttServer"
},
{
type: "doc",
id: "303",
label: "RabbitMQProducer"
},
{
type: "doc",
id: "304",
label: "KafkaProducer"
},
{
type: "doc",
id: "305",
label: "TDengineDBProducer"
},
{
type: "doc",
id: "306",
label: "QuestDBProducer"
},
{
type: "doc",
id: "307",
label: "SqlDBProducer"
},
{
type: "doc",
id: "308",
label: "SqlHisAlarm"
},
{
type: "doc",
id: "309",
label: "OpcUaServer"
},
]
},
{
type: "category",
label: "Pro插件手册",
items: [
{
type: "doc",
id: "10001",
label: "ABCipMatser"
},
]
},
{
type: "category",
label: "部署",
items: [
{
type: "doc",
id: "400",
label: "编译发布"
},
{
type: "doc",
id: "401",
label: "windows服务部署"
},
{
type: "doc",
id: "402",
label: "iis部署"
},
{
type: "doc",
id: "403",
label: "docker部署"
},
{
type: "doc",
id: "404",
label: "linux服务部署"
}
]
},
{
type: "category",
label: "常见问题",
items: [
{
type: "doc",
id: "501",
label: "常见问题"
},
{
type: "doc",
id: "502",
label: "脚本常见问题"
},
]
},
{
type: "category",
label: "插件开发",
items: [
{
type: "doc",
id: "601",
label: "采集插件"
},
{
type: "doc",
id: "602",
label: "业务插件"
},
]
},
{
type: "category",
label: "nuget包文档",
items: [
{
type: "doc",
id: "20001",
label: "Modbus"
},
{
type: "doc",
id: "20002",
label: "SiemensS7"
},
{
type: "doc",
id: "20003",
label: "OpcDa"
},
{
type: "doc",
id: "20004",
label: "OpcUa"
},
{
type: "doc",
id: "20005",
label: "Dlt645"
},
]
},
{
type: "category",
label: "协议开发教程",
items: [
{
type: "doc",
label: "基础知识",
id: "30001",
}
]
},
{
type: "category",
label: "技术支持/合作",
items: [
{
type: "doc",
id: "1002",
label: "联系我们"
},
{
type: "doc",
id: "1000",
label: "赞助项目"
},
{
type: "doc",
id: "1001",
label: "Pro版"
},
]
},
]
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Some files were not shown because too many files have changed in this diff Show More