
有关如何使用廉价的中文设备创建可编程逻辑控制器的文章。 这样的设备将在家庭自动化和学校计算机科学的实践课程中找到其应用。
作为参考,默认情况下,Sonoff Basic程序通过中文云服务与移动应用程序一起使用,在提议的更改之后,与该设备的所有进一步交互将在浏览器中成为可能。第一节将Sonoff连接到MGT24
步骤1.创建一个控制面板
在
mgt24网站上注册(如果尚未注册),然后使用您的帐户登录。
要为新设备创建控制面板,请单击“ +”按钮。
创建面板后,它将出现在面板列表中。
在创建的面板的“设置”选项卡中,找到“设备ID”和“授权密钥”字段,以后,在设置Sonoff设备时将需要此信息。
步骤2.刷新设备
使用
XTCOM_UTIL实用程序
,将
Sonoff Basic PLC固件下载到设备,为此您需要一个USB-TTL转换器。 这是
说明和
视频说明 。
步骤3.配置设备
给设备通电,LED点亮后,按住按钮不放,直到LED开始定期均匀闪烁。
此时,将出现一个名为“ PLC Sonoff Basic”的新wi-fi网络,将您的计算机连接到该网络。
打开Internet浏览器,然后在地址栏中输入文本“ 192.168.4.1”,然后转到设备的网络设置页面。
填写以下字段:
- “网络名称”和“密码”(将设备绑定到家庭wi-fi路由器)。
- “设备ID”和“授权密钥”(用于授权MGT24服务上的设备)。
保存设置并重新启动设备。
这是一个
视频教程 。
步骤4.连接传感器(可选)
当前固件最多支持四个ds18b20温度传感器。 这是有关安装传感器的
视频教程 。 显然,此步骤将是最困难的,因为它将需要直接操作和烙铁。
第二节。 可视化编程
步骤1.编写脚本
Blockly用作编程环境,该环境易于学习,因此您无需成为程序员即可创建简单的脚本。
我添加了用于写入和读取设备参数的专用块。 通过名称访问任何参数。 化合物名称用于远程设备参数:“ parameter @ device”。
循环打开和关闭负载(1Hz)的场景的示例:

同步两个单独设备的操作的示例场景。 即,目标设备的中继重复远程设备的中继的操作。

恒温器场景(无迟滞):

要创建更复杂的脚本,可以使用变量,循环,函数(带有参数)和其他构造。 我这里不会详细描述所有这些,网络上已经有很多
关于Blockly的
培训材料 。
步骤2.脚本顺序
该脚本会连续运行,并在结束时立即重新开始。 有两个可以暂时挂起脚本的块:“延迟”和“暂停”。
延迟块用于毫秒或微秒延迟。 该单元严格保持时间间隔,从而阻止整个设备的运行。
暂停块用于第二个(可能更少)延迟,并且它不阻止设备中其他进程的执行。
如果脚本本身包含无限循环,并且该循环的主体中没有“暂停”,则解释器将独立启动一个小暂停。
如果分配的内存堆栈已用完,则解释器将停止执行此类冗长的脚本(请谨慎使用递归函数)。
步骤3.调试脚本
要调试已加载到设备中的脚本,可以分步运行程序跟踪。 当脚本的行为不是作者想要的时,这可能非常有用。 在这种情况下,跟踪使作者可以快速找到问题的根源并在脚本中修复错误。
用于在调试模式下计算阶乘的脚本:

调试工具非常简单,由三个主要按钮组成:“开始”,“向前迈出”和“停止”(我们也不会忘记调试模式中的“进入”和“退出”)。 除了逐步跟踪之外,您还可以在任何块上设置断点(通过单击该块)。
要在监视器中显示参数(传感器,继电器)的当前值,请使用打印块。
这是有关使用调试器的
概述视频 。
科为好奇。 但是到底是什么呢?
为了使脚本能在目标设备上运行,开发了38条指令的字节码解释器和汇编器。 块状源代码中内置了专门的代码生成器,可将可视块转换为汇编器指令。 将来,该汇编程序将转换为字节码,然后传输到设备中执行。
该虚拟机的体系结构非常简单,没有任何描述的意义;在网上可以找到许多有关简单虚拟机设计的文章。
对于我的虚拟机堆栈,我通常分配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));
至于性能。 当我开始最简单的闪光器场景时,在示波器屏幕上,我得到了47kHz的弯曲(在80MHz的处理器时钟速度下)。


我认为这是一个很好的结果,至少这个速度几乎是
Lua和
Espruino的十倍 。
最后一部分
总而言之,我要说的是,使用脚本不仅使我们可以对单个设备的逻辑进行编程,而且还可以将多个设备链接为一个机制,其中某些设备会影响其他设备的行为。
我还注意到,所选择的存储脚本的方法(直接在设备本身中,而不是在服务器中),简化了将现有设备切换到另一台服务器(例如到家庭Raspberry)的
操作 ,这是
说明 。
仅此而已,我将很高兴听到建议和建设性的批评。