我正在编写一个包裹分拣机的PLC程序(Q系列三菱PLC, GXWORKS 2软件)。机器的逻辑如下:
1。包裹在传送带中被诱导。条形码阅读器扫描器获取包的条形码。
2。条形码被发送到我们的SMS(分拣管理系统),它计算出口并将其发送回PLC。
3。包裹到达计算出口,然后导出到滑槽。
产品的跟踪是由编码器和移位寄存器完成的。这意味着每个内存地址表示传送带中的一个物理位置。然后,移位寄存器沿着内存缓冲区移动代表包的位,直到该位到达代表出口的地址,这样就可以导出包。
我的问题不是产品跟踪,而是产品ID跟踪:
当一个包装进入输送机时,为该产品设置一个ID(1,2,…,n)。这个想法是,这个ID用于跟踪包的状态,例如,如果包是在正确的出口中派生的,如果它有损坏的条形码,等等。
我的问题是,我如何以一种有效的方式跟踪这个ID。我在考虑使用相同的移位寄存器,而不是移动单个位,而是移动一个更大的数字,例如|1|0000011|,其中第一个位就像一个标志,代表产品的存在,其余的数字是产品ID。当标志到达出口地址时,我可以减去10000011 - 10000000 = 00000011,以获得产品ID。
还有更有效的方法吗?
编码器的部分对我来说不清楚,所以我用一个新x的传感器代替它。也许你能解释得更好,然后我将更新答案。
现在,让我们想象一个简单的输送机模型:
S S S
| | |EXIT
---------------------------------------------------
x x x x
---------------------------------------------------
- x是输送机上的包装
- s是沿输送机的传感器
- EXIT是包退出的地方
你可以创建一个函数块来表示一个包:FB_Package
FB_Package的数据结构如下:
TYPE ST_Package :
STRUCT
sBarcode : STRING;
eLocation : E_ConveyorLocation;
eState : E_PackageState;
uiPackageID: UINT;
END_STRUCT
END_TYPE
然后你可以创建一个FB_Conveyor,它拥有/或管理一个FB_Packages数组
FB_Package有一个步骤链,它检查输送机上的当前位置。每当它从传送带接收到一个新位置时,它都会在步进链中检查该位置是否与当前位置(例如,到达下一个位置的时间框架以及接收到的位置是否在当前位置之后)相匹配。如果检查成功,包更新它的位置,当到达最后一个位置时,fbPackage实例将其状态更改为ePackageExited。
fbConveyor实例识别出包已经退出了输送机,并在数组中重置它的实例。
正如您所看到的,我使用ENUMS作为包的位置和状态,因为它们是人类可读的,并且使您的代码更容易理解,而不是在字节中移动位。