Есть много ответов на этот вопрос: Как сказано в Art, нет настоящих «лучших» практик. Все зависит от приложения. Нет «лучших» практик, потому что практика, которая делает ее «лучше» в одном аспекте, как правило, «ухудшает» ее в другой. Так же, как прямолинейный пример: если вы кодируете общность, вы жертвуете простотой. Кроме того, все, кто может сказать вам, это их собственные практики, и кто скажет, что они являются «лучшими»? С другой стороны, наилучшей практикой является тот, который работает; или, может быть, даже более того, наилучшей практикой является тот, который у вас есть. Вместо того, чтобы думать о «лучших» практиках, используйте имеющиеся в вашем распоряжении методы, чтобы довести проект до завершения, а затем подумайте об лучше практик.
Это, как говорится, это как раз об этом: Как сказано в статье, отдельные функциональные блоки в подпрограммы. Это организует ваш код и позволяет включать/выключать вещи, вызывая/не вызывая подпрограмму.
Сделайте части памяти многоразовыми, когда это возможно. Это можно сделать с помощью подпрограмм. Если вы можете быть уверены, что в какое-то конкретное время только одна подпрограмма будет использовать эту память, тогда эта память будет повторно использоваться в каждой подпрограмме. Это отлично подходит для систем ПЛК с экранами: каждый экран получает подпрограмму, содержащую логику лестницы, которая запускает этот экран, и каждый экран повторно использует один и тот же блок памяти, потому что, поскольку мы можем быть только на одном экране за раз, мы можем быть уверены что только одна подпрограмма пытается использовать это пространство памяти, включив подпрограмму этого экрана и остальную часть.
ПРЕДУПРЕЖДЕНИЕ. Если вы это сделаете, вы должны убедиться, что вы повторно инициализируете этот блок памяти, прежде чем использовать его подпрограмму. Если биты, управляющие логикой, остаются подпрограммой, которая ранее использовала пространство памяти, и вы неправильно инициализировали память до того, как следующая подпрограмма приступит к ее использованию, ну ... вы можете не получить ожидаемые результаты.
Итак, теперь вы должны выбрать способ смягчения последствий решения исходной проблемы, заключающейся в возможности повторного использования блоков памяти (просто для того, чтобы еще раз подчеркнуть, почему нет «лучших» практик: одно решение вызывает другие проблемы , с которым вы должны иметь дело). Сбрасываете ли вы все, как только вы его используете? Сбрасываете ли вы все сразу, когда все готово? Сбрасываете ли вы все сразу, прежде чем запускать следующую подпрограмму? Вы пытаетесь написать более надежный код, который будет соответствующим образом реагировать на различные сценарии инициализации? Я мог бы рассказать вам ответ. Это будет правильный ответ? Есть ли справа ответ? Я не знаю, но вместо того, чтобы дать вам ответ на этот вопрос, я представил 4 возможных решения. Программирование, по иронии судьбы, не является точной наукой.
В любом случае, еще одно преимущество разделения вещей на подпрограммы и повторное использование блоков памяти заключается в том, что в этих блоках памяти вы можете написать довольно сложную каскадную логику (т.е. бит установлен, а строка, которая показывает этот бит, выполняет операцию, а затем устанавливает следующую бит и сбрасывает исходный бит, тем самым позволяя вам выполнять сложную последовательность операций). Если бы вы не использовали много места, такая каскадная логика начала бы занимать много места и на самом деле не была бы очень чистой: последовательность из 30 последовательных операций требует резервирования 30 бит для запуска каждой из этих операций. Если вы не используете много места, ваше кодирование будет грязным и неорганизованным. Если вы повторно используете блок памяти, вы можете выполнять столько операций, сколько хотите, не беспокоясь о том, чтобы занимать больше места каждый раз, когда вы пишете другую подпрограмму, которая может использовать этот блок памяти, и ваша кодировка будет чистой и простой, поскольку она вынимает все больше беспокоиться о разделении памяти на эти фрагменты кода. Это делает организацию гораздо более легкой задачей, а организация всего в процессе программирования.
Перейдя, вы, несомненно, будете использовать физические входы и выходы. Вы также можете использовать другие встроенные функции, такие как таймеры/счетчики, и рассчитанные значения на основе входов, которые вы будете отслеживать непрерывно, и использовать позже в системе в качестве параметров управления. Назовем все эти «операнды». Все ваши операнды должны быть буферизованы. Вместо того, чтобы писать свой код для непосредственного чтения или записи операндов, создайте систему, которая будет записывать все свои значения в другое место в памяти с возможностью включения/выключения этого процесса записи и написать весь код, который будет использовать операнды для вместо этого используйте эти «буферизованные» значения. Это дает вам возможность переключаться между «автоматическим» и «ручным» режимами. Даже если вы можете просто отключить, где ваши расчетные значения получат свой ввод, чтобы достичь этого для этих операндов, вам все равно придется буферизировать остальные (не рассчитанные значения), и есть много ситуаций, в которых вы хотели бы быть в состоянии сохранить значение, которое обычно было бы там, не переписывая его, когда вы переходите в ручной режим (т. е. счетчик или что-либо с постоянным значением). Даже если бы были ситуации, когда вы действительно не делаете заботитесь о сохранении постоянного значения (то есть скорости или чего-либо еще полностью мгновенного), вы все равно будете нарушать форму остальной части вашей автоматической/ручной системы, таким образом, вычисляемые значения.
Другая практика, с которой я начал использовать, с большим успехом (это, по-видимому, хорошо подходит для промышленных приложений управления), является «автоматом» стиля программирования. В простом примере программа может просто находиться в одном из нескольких состояний.Основная задняя часть программы, «автомат», управляет состоянием системы. Автомат существенно кодирует высокоуровневые аспекты системы. Вы кодируете автомат для взаимодействия с «тестовыми» подпрограммами, которые имитируют соответствующий ответ части кода, который обычно вызывается в этом случае. Теперь, когда системная архитектура высокого уровня закодирована, вы можете пройти и начать выключение тестовых подпрограмм с помощью реальных алгоритмов.
Я уверен, что больше я могу вам сказать, но трудно придумать с верхней части моей головы, особенно не больше знаний о том, что вы пытаетесь сделать с ПЛК
Стандартизация некоторых из «Лучшая практика» лестничной логики была причиной для создания этого [Шаблоны программирования логики лестницы] (http://www.contactandcoil.com/patterns-of-ladder-logic-programming/) (отказ от ответственности - это то, что я написал). –