Стартовая страница › Форумы › Разработка и интеграция › Остановка опроса по массиву байт или байту
- В этой теме 49 ответов, 2 участника, последнее обновление 4 года, 6 месяцев назад сделано Mikhail.
-
АвторСообщения
-
21.10.2019 в 11:41 #13955manjey73Участник
public class MyStopCondition : Connection.BinStopCondition // TEST логики остановки по двум массивам { public MyStopCondition(byte[] stop0, byte[] stop1) : base(stop0) { Stop0 = stop0; Stop1 = stop1; } public byte[] Stop0 { get; protected set; } public byte[] Stop1 { get; protected set; } public override bool CheckCondition(byte[] buffer, int index) { StopSeq = Stop0; if (base.CheckCondition(buffer, index)) { return true; } else { StopSeq = Stop1; return base.CheckCondition(buffer, index); } } }
MyStopCondition testStop = new MyStopCondition(new byte[] { 0x0D, 0x0A }, new byte[] { 0x03, 0x50 }); bool stopReceived; readCnt = Connection.Read(buffer, 0, MaxRxDLen, ReqParams.Timeout, testStop, out stopReceived, CommUtils.ProtocolLogFormats.String, out logText);
в итоге так срабатывает либо по одному, либо по второму массиву
22.10.2019 в 17:11 #13962manjey73УчастникВ общем сделал даже по List<byte[]>
в public class KpXXXXLogic : KPLogic добавил
private readonly static MyStopCondition testStop; private static List<byte[]> stopList = new List<byte[]>(); public class MyStopCondition : Connection.BinStopCondition // TEST логики остановки по двум массивам { public MyStopCondition(List<byte[]> stopL) { Stop = stopL; } public List<byte[]> Stop { get; private set; } public override bool CheckCondition(byte[] buffer, int index) { bool checkStop = false; for (int u = 0; u < Stop.Count; u++) { StopSeq = Stop[u]; checkStop = base.CheckCondition(buffer, index); if (checkStop) break; } return checkStop; } }
В конструктор static KpXXXXLogic() добавил
byte[] stop0 = new byte[] { 0x0D, 0x0A }; // массив остановки 1 byte[] stop1 = new byte[] { 0x03, 0x50 }; // массив остановки 2 if (stopList.IndexOf(stop0) == -1) stopList.Add(stop0); if (stopList.IndexOf(stop1) == -1) stopList.Add(stop1); testStop = new MyStopCondition(stopList);
Ну и собственно чтение с остановкой
bool stopReceived; readCnt = Connection.Read(buffer, 0, MaxRxDLen, ReqParams.Timeout, testStop, out stopReceived, CommUtils.ProtocolLogFormats.String, out logText);
Надеюсь будет и по трем массивам останавливать ,чуть позже проверю. Надо только добавить в ScadaCommCommon.Connection.BinStopCondition пустой конструктор, чтобы base не вводить
И не очень нравится код проверки в цикле с выходом, может можно как-то красивее сделать ?
Ну и то, что List массивов является ссылочным, надо создавать массивы отдельно для каждого примера остановки.22.10.2019 в 18:32 #13968MikhailМодераторМожно сделать
if (base.CheckCondition(buffer, index))
return true;а в конце метода return false;
Можно попробовать stopList.AddRange(и здесь передать все массивы)
Дело вкуса.23.10.2019 в 10:33 #13969manjey73УчастникСпасибо, переделал через foreach с кодом, что дали выше и массивы заполнил через AddRange. Вполне красиво получилось.
Не забудьте в следующей версии добавить пустой конструктор в BinStopCondition в релизе, я пока сам добавил для проверки.
- Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
23.10.2019 в 18:34 #13974MikhailМодераторпустой конструктор в BinStopCondition
OK
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.