分拣机中的产品 ID 跟踪(PLC 编程)
Product ID tracking in a sorter machine (PLC programming)
我正在为包裹分拣机编写 PLC 程序(Q 系列三菱 PLC,GXWORKS 2 软件)。机器逻辑如下:
1.Packages在传送带中被感应。条形码 reader 扫描仪获取包裹条形码。
2.Barcode发送到我们的SMS(分拣管理系统),它计算出口并发送回PLC。
3.Package 行进到计算出的出口,然后进入滑道。
产品的跟踪是由编码器和移位寄存器完成的。这意味着每个内存地址都代表传送带中的一个物理位置。然后,移位寄存器将代表包的位沿着内存缓冲区移动,直到该位到达代表出口的地址,这样就可以导出包。
我的问题不是产品追踪问题,而是产品ID追踪问题:
当包裹进入传送带时,会为该产品设置一个 ID (1,2,...,n)。这个想法是这个 ID 用于跟踪该包裹的状态,例如包裹是否在正确的出口处派生,是否有损坏的条形码等。
我的问题是,如何才能有效地跟踪此 ID。我在考虑使用同一个移位寄存器,不移动一个位,而是移动一个更大的数字,例如 |1|0000011|,其中第一位就像一个标志,代表产品的存在,其余数字是产品编号。当标志到达出口地址时,我可以减去 10000011 - 10000000 = 00000011,以获得产品 ID。
有没有更有效的方法来做到这一点?
编码器部分我不太清楚,所以我用nr 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,has/or 管理一个 FB_Packages
的数组
FB_Package 有一个步骤链,用于检查传送带上的当前位置。
每次它从传送带接收到一个新位置时,它都会在其步骤链中检查该位置是否合理,考虑到当前位置(例如,到达下一个位置的时间范围以及接收到的位置是否在当前位置之后)。
如果检查成功,包会更新它的位置,并且当到达最后一个位置时,fbPackage 实例会将其状态更改为 ePackageExited。
fbConveyor 实例识别出包裹已退出传送带并重置其在数组中的实例。
如您所见,我将 ENUMS 用于包位置和状态,因为它们是人类可读的,并且比以字节为单位移动位更容易理解您的代码。
我正在为包裹分拣机编写 PLC 程序(Q 系列三菱 PLC,GXWORKS 2 软件)。机器逻辑如下:
1.Packages在传送带中被感应。条形码 reader 扫描仪获取包裹条形码。
2.Barcode发送到我们的SMS(分拣管理系统),它计算出口并发送回PLC。
3.Package 行进到计算出的出口,然后进入滑道。
产品的跟踪是由编码器和移位寄存器完成的。这意味着每个内存地址都代表传送带中的一个物理位置。然后,移位寄存器将代表包的位沿着内存缓冲区移动,直到该位到达代表出口的地址,这样就可以导出包。
我的问题不是产品追踪问题,而是产品ID追踪问题:
当包裹进入传送带时,会为该产品设置一个 ID (1,2,...,n)。这个想法是这个 ID 用于跟踪该包裹的状态,例如包裹是否在正确的出口处派生,是否有损坏的条形码等。
我的问题是,如何才能有效地跟踪此 ID。我在考虑使用同一个移位寄存器,不移动一个位,而是移动一个更大的数字,例如 |1|0000011|,其中第一位就像一个标志,代表产品的存在,其余数字是产品编号。当标志到达出口地址时,我可以减去 10000011 - 10000000 = 00000011,以获得产品 ID。
有没有更有效的方法来做到这一点?
编码器部分我不太清楚,所以我用nr 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,has/or 管理一个 FB_Packages
的数组FB_Package 有一个步骤链,用于检查传送带上的当前位置。 每次它从传送带接收到一个新位置时,它都会在其步骤链中检查该位置是否合理,考虑到当前位置(例如,到达下一个位置的时间范围以及接收到的位置是否在当前位置之后)。 如果检查成功,包会更新它的位置,并且当到达最后一个位置时,fbPackage 实例会将其状态更改为 ePackageExited。
fbConveyor 实例识别出包裹已退出传送带并重置其在数组中的实例。
如您所见,我将 ENUMS 用于包位置和状态,因为它们是人类可读的,并且比以字节为单位移动位更容易理解您的代码。