作者 | 主题 |
---|---|
牛逼之人必有牛逼之处 游士 经验值:229 发帖数:30 精华帖:0 |
楼主 2022-05-16 23:46:33
主题:分享一些好玩的程序块,以时间锁开始 20220801更新: 肯定有人遇到下面一些情况: 1、多台设备几乎在同一时间进行请求启动,但同一时刻仅允许同一台设备启动,这将面临第一个难题:谁启动? 2、我们可以按照同一时间内谁先请求,谁启动的原则,该设备启动后,与禁止其他设备运行,但是,我这里仍然要说“但是”,如果所有设备真的同时申请启动,而且每一次申请都是同时,那么肯定总会是程序写在前面的设备运行,设备对应的程序靠后的,将永远被前面的设备禁止,导致无法启动,那么我们面临第二个问题:需要加入优先级的概念,未启动过的设备优先级提高,启动过的设备优先级降低。 3、当我们使用一个程序块解决了第二个难题后,我们可能遇到第三种情况,每一个项目的设备数量是不一定的,如果功能块只针对解决三个设备的难题,那么遇到四个设备的项目时,将需要重新做功能块,为此,我们遇到第三个难题:扩展性,我们该如果在不重新编写功能块的情况下,让解决第二个难题的功能块具备扩展性,能够适应不同设备数量的项目? 为此,我做了下面这个功能块: 轮换分站块: INPUT: 允许自动 BOOL 切换时长 TIME_OF_DAY 切换日 UINT 复位 BOOL 模块排序 BYTE 启动数量 BYTE INOUT 总线 ARRAY[0-3] OF BYTE OUTPUT 输出 BOOL 【术语】 超级FB 下面涉及到一个名词【超级FB】,【超级FB】是通过总线数据区,将多个独立的FB链接,所有被链接的FB组成一个整体,称为【超级FB】,注意,【超级FB】内,必须有一个FB的模块排序为2。 【描述】 该FB可以通过【总线】数据区,将多个连接,从而组合成为一个【超级FB】,一个设备对应一个FB,N个设备使用N个FB,从而实现扩展性。 【超级FB】通过允许自动IN 感知到外部请求启动的设备,然后根据策略,自动根据优先级分配启动信号,再从输出OUT,给予对应的设备启动信号。 分配策略如下: 1、先启动,先停止(可以设置为先启动,后停止) 2、最后停止的设备,最后启动。 时间锁: 这玩意其实我几乎不用到,毕竟作为设备采购方,都是被别人使用在自己身上,所以也算研究过。 用途:设备供应商为了有向甲方要工程款的底气,都会在自己供应的设备商添加时间锁。 制作原因:与一些关系好的同行交流过时间锁之类的程序,总感觉他们的想法不够完美,所以自己研究了一下。 程序块: 输入引脚: 1、请求解锁 bool 2、获取请求码 bool 3、公钥 string 4、私钥 string 输出引脚: 1、允许 bool 2、到期年 int 3、到期月 int 4、到期日 int 5、请求码 string 利用此功能块,将【获取请求码】置一,将从【请求码】输出一串32个字符的字符串,称为请求码。 通过请求码,利用一个Excel文件,结合设定的【到期时间】以及【私钥】,便可以计算出来一个合适的【公钥】,此【公钥】仅在设定的【到期时间】之前有效。 在有效期内,将公钥从【公钥】输入引脚输入,再将【请求解锁】置一,此时,【允许】也会置一。 在有效期之后,【允许】会被一直置零。 Excel文件: Excel文件有四项空格: 1、请求码 2、私钥 3、有效时间 4、公钥 前面三相需要填写。 私钥:需要由工程师指定一个常量,为字符串型,仅限英文与数字。 请求码:通过前面提到的方法,从程序块中获得请求码,填入Excel文件内。 有效时间:工程师指定的到期时间,格式为8位数字,前四位为年份,五六位为月份,最后两位为日期。 公钥:点击【获取密码】按钮,即可获得公钥,将该公钥填入程序块的【公钥输入点】内,在利用前面提到方法,激活【允许】输出。 20220519更新 【哈希算法】 众所周知,哈希算能够将输入的不限长度、不限类型的字符串转化为哈希码,哈希码是一串32位字符串,由数字与英文组成,算法具备良好的雪崩效应、防碰撞性以及单向性。 说人话就是,算法能够将任何从输入端的文字转化为32位的字符串,被称为哈希码,即使随便改变文章中其中一个字符串,也会导致哈希码产生颠覆性的变化,此为雪崩效应; 只要两段文字有一丝丝的不一样,或者有非常颠覆性的不一样,它们两者转化过来的哈希码都会有颠覆性的差别,此为防碰撞性; 而单向性,顾名思义则是有人试图想要从哈希码推断出来转化为此哈希码的原文,那将是痴心妄想,或者足够的时间可以,但那个时候,可能已经世界末日了。 MD5算法: MD5算法是哈希算法的一种,引脚如下: input sMessage string stype int inout 可变数组 Array[*] of DWord output ret_val string 【描述】 原文可以从sMessage中输入,并将stype设置为32,可变数组需要在DB块中声明,可以声明为ARRAY[0...70] fo dword ,然后通过ret_val 输出32个字符的哈希码。。 |