一篇关于如何用廉价的中国设备创建可编程逻辑控制器的文章。 这种设备将在家庭自动化和学校计算机科学的实践课程中得到应用。
作为参考,默认情况下,Sonoff Basic 程序通过中国云服务与移动应用程序配合使用;在建议的修改后,与该设备的所有进一步交互都可以在浏览器中进行。
第 I 部分. 将 Sonoff 连接到 MGT24 服务
第 1 步:创建控制面板
在网站上注册
登录
要为新设备创建控制面板,请单击“+”按钮。
创建面板的示例
创建面板后,它将出现在您的面板列表中。
在创建的面板的“设置”选项卡中,找到“设备 ID”和“授权密钥”字段;将来在设置 Sonoff 设备时将需要此信息。
选项卡示例
步骤 2. 重新刷新设备
使用实用程序
步骤 3. 设备设置
给设备通电,待 LED 亮起后,按住按钮直至 LED 开始周期性均匀闪烁。
此时会出现一个名为“PLC Sonoff Basic”的新Wi-Fi网络,将您的计算机连接到该网络。
LED指示说明
LED指示
设备状态
周期性双闪
没有连接到路由器
持续发光
与路由器建立连接
周期性均匀闪烁
Wi-Fi 接入点模式
熄灭了
无电源
打开互联网浏览器并在地址栏中输入文本“192.168.4.1”,进入设备的网络设置设置页面。
填写字段如下:
- “网络名称”和“密码”(将设备链接到您的家庭 Wi-Fi 路由器)。
- “设备 ID”和“授权密钥”(用于在 MGT24 服务上授权设备)。
设置设备网络参数示例
保存设置并重新启动设备。
这是
步骤 4. 连接传感器(可选)
当前固件最多支持四个 ds18b20 温度传感器。 这里
第二节。 可视化编程
第 1 步:创建脚本
用作编程环境
我添加了用于写入和读取设备参数的专用块。 任何参数都可以通过名称来访问。 对于远程设备的参数,使用复合名称:“参数@设备”。
选项下拉列表
循环打开和关闭负载 (1Hz) 的示例场景:
同步两个独立设备操作的脚本示例。 即,目标设备的继电器重复远程设备的继电器的操作。
恒温器场景(无迟滞):
要创建更复杂的脚本,您可以使用变量、循环、函数(带参数)和其他结构。 这里就不详细描述了,网上已经有很多了。
第 2 步:脚本顺序
脚本不断运行,一旦到达终点,就会重新开始。 在这种情况下,有两个块可以暂时暂停脚本,“延迟”和“暂停”。
“延迟”块用于毫秒或微秒延迟。 该块严格保持时间间隔,阻塞整个设备的运行。
“暂停”块用于第二(或更少)延迟,并且它不会阻止设备中其他进程的执行。
如果脚本本身包含无限循环,且其主体不包含“暂停”,则解释器会独立启动短暂的暂停。
如果分配的内存堆栈耗尽,解释器将停止执行这种耗电的脚本(小心递归函数)。
第三步:调试脚本
要调试已加载到设备中的脚本,您可以逐步运行程序跟踪。 当脚本的行为与作者的意图不同时,这可能非常有用。 在这种情况下,追踪可以让作者快速找到问题的根源并纠正脚本中的错误。
调试模式下计算阶乘的场景:
调试工具非常简单,由三个主要按钮组成:“开始”、“向前一步”和“停止”(我们也不要忘记“进入”和“退出”调试模式)。 除了逐步跟踪之外,您还可以在任何块上设置断点(通过单击该块)。
要在监视器中显示参数(传感器、继电器)的当前值,请使用“打印”块。
这是
好奇的部分。 引擎盖下是什么?
为了使脚本能够在目标设备上运行,开发了一个字节码解释器和一个包含 38 条指令的汇编器。 Blockly 的源代码内置了一个专门的代码生成器,可以将可视块转换为汇编指令。 随后,该汇编程序被转换为字节码并传输到设备执行。
这个虚拟机的架构非常简单,没有什么特别的描述点;在互联网上你会找到很多关于设计最简单的虚拟机的文章。
我通常为我的虚拟机的堆栈分配1000字节,这足够备用。 当然,深度递归可以耗尽任何堆栈,但它们不太可能有任何实际用途。
生成的字节码非常紧凑。 例如,计算相同阶乘的字节码只有 49 个字节。 这是它的视觉形式:
这是他的汇编程序:
shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret
如果表示的汇编形式没有任何实用价值,那么“javascrit”选项卡恰恰相反,比视觉块给出了更熟悉的外观:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
关于性能。 当我运行最简单的闪存脚本时,我在示波器屏幕上看到了 47 kHz 方波(处理器时钟速度为 80 MHz)。
我觉得这已经是一个不错的结果了,至少这个速度比之前快了差不多十倍
最后一部分
总而言之,我想说的是,使用脚本不仅允许我们对单独设备的操作逻辑进行编程,而且还可以将多个设备连接到单个机制中,其中某些设备会影响其他设备的行为。
我还注意到,所选择的存储脚本的方法(直接在设备本身中,而不是在服务器上)简化了将已经工作的设备切换到另一台服务器,例如切换到家庭 Raspberry,这里
仅此而已,我很高兴听到建议和建设性的批评。
来源: habr.com