Tout cela semble complètement surcompliqué. Vous avez un index d'encodeur qui bascule à 10000 et des objets qui roulent le long de la ligne dont vous suivez les positions à un instant donné. Si vous devez projeter des points d'arrêt ou des points d'action le long de la ligne, ajoutez simplement autant de pouces que nécessaire et soustrayez immédiatement 10000 si le résultat cible est supérieur à 10000.
Alternativement, ou en outre, vous obtenez toujours une nouvelle valeur d'encodeur à chaque scan PLC. Dans le cas où la différence entre la valeur actuelle et la dernière valeur est négative, vous pouvez activer un contact de travail pour signaler l'événement de rebouclage et apporter les corrections appropriées pour tout calcul sur ce scan. (**ou incrémentez un compteur secondaire comme ci-dessous)
Sans en savoir plus sur le problème réel, il est difficile de suggérer une solution plus spécifique mais il y a certainement de meilleures solutions. Je ne vois aucune nécessité de MOD ici. De plus, les gars sur le terrain vous remercieront de ne pas remplir la machine avec des trucs de sorcier obfusqués.
Je cite :
Enfin, cela doit fonctionner pour les décimales en virgule flottante, par exemple 12345,678 MOD 10000 = 2345,678
Il existe une fonction brillante pour cela - c'est une soustraction. Pourquoi cela doit-il être plus compliqué que ça? Si votre ligne de convoyage est en fait plus longue que 833 pieds, faites alors un second compteur qui s'incrémente à chaque rebouclage de l'index principal jusqu'à ce que vous ayez assez de distance pour couvrir la distance requise.
Par exemple, si vous avez besoin de 100000 pouces de mémoire de convoyeur, vous pouvez avoir un compteur secondaire qui bascule à 10. Les rebouclages de l'encodeur principal peuvent être facilement détectés comme ci-dessus et vous incrémentez le compteur secondaire à chaque fois. Votre position d'encodeur de travail est donc 10000 fois la valeur du compteur plus la valeur actuelle de l'encodeur. Travaillez uniquement avec les unités étendues et faites basculer le compteur secondaire à la valeur requise pour ne perdre aucune pièce. Le problème, ensuite, se réduit à une simple soustraction (comme ci-dessus).
J'utilise cette technique avec un support de pièce rotatif à engrenage planétaire, par exemple. J'ai un encodeur qui bascule une fois par rotation principale tandis que les pièces satellites à engrenage planétaire (qui tournent autour d'un engrenage stator) nécessitent 43 rotations principales pour revenir à une orientation de départ identique. Avec un simple compteur qui s'incrémente (ou se décrémente, en fonction de la direction) au point de rebouclage de l'encodeur principal, cela vous donne une mesure entièrement absolue de l'emplacement des pièces. Dans ce cas, le compteur secondaire bascule à 43.
Cela fonctionnerait de manière identique pour un convoyeur linéaire, la seule différence étant qu'un convoyeur linéaire peut s'étendre sur une distance infinie. Le problème doit alors être limité par le chemin linéaire le plus long pris par la pièce en cas de figure défavorable.
Avec la réserve que je n'ai jamais utilisé RSLogix, voici l'idée générale (j'ai utilisé des symboles génériques et ma syntaxe est probablement un peu incorrecte mais vous devriez comprendre l'idée)
Grâce à ce qui précède, vous obtenez une valeur ENC_EXT
qui a essentiellement transformé votre encodeur d'un pouce de 10k en un pouce de 100k. Je ne sais pas si votre convoyeur peut fonctionner en sens inverse, si c'est le cas vous devriez également gérer le décompte. Si le reste de votre programme fonctionne uniquement avec la valeur ENC_EXT
alors vous n'avez même pas à vous soucier du fait que votre codeur n'atteint que 10k. Il atteint désormais 100k (ou la valeur que vous souhaitez) et le rebouclage peut être géré avec une soustraction au lieu d'un modulo.
Après coup :
Les API sont avant tout des machines à état. Les meilleures solutions pour les programmes API sont généralement celles qui sont en harmonie avec cette idée. Si votre matériel ne permet pas de représenter pleinement l'état de la machine, le programme API doit faire de son mieux pour combler les lacunes de ces informations d'état manquantes avec les informations dont il dispose. La solution ci-dessus le fait - elle prend les 10000 pouces d'informations d'état insuffisantes et les étend pour répondre aux exigences du processus.
L'avantage de cette approche est que vous avez désormais préservé des informations d'état absolues, non seulement pour le convoyeur, mais aussi pour toutes les pièces sur la ligne. Vous pouvez les suivre en avant et en arrière pour le dépannage et le débogage et vous disposez d'un système de coordonnées beaucoup plus simple et clair pour les futures extensions. Avec un calcul de modulo, vous jetez des informations d'état et essayez de résoudre des problèmes individuels de manière fonctionnelle - ce n'est souvent pas la meilleure façon de travailler avec les API. Vous devez un peu oublier ce que vous savez des autres langages de programmation et travailler différemment. Les API sont une bête différente et elles fonctionnent le mieux lorsqu'elles sont traitées comme telles.