Что нового

Математика Определить наибольшее значение числа, которое изменяется в переменной.

Godygadu

Новичок
Сообщения
47
Репутация
0
Здравствуйте. На работе стала необходимость автоматизации весового участка. Суть в том, чтобы в БД записывалось значения веса транспорта. Значение веса получаю с цифрового индикатора по RS232, обрабатываю его и получаю цифры. Нужно сделать так, чтобы после определения максимального веса авто, то есть когда весы остановили взвешивание, происходила дальнейшая логика. Есть проблема, которая может помешать - весы не имеют стабильности и даже, если, весы остановили взвешивание, то значение будет колебаться в промежутке -20 - 20. Направьте на способ решения. Спасибо.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Дак если у тебя массив данных, что мешает просто использовать функцию
Код:
_ArrayMax()
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Вы предлагаете сначала вносить показания весов в массив, а затем в нём искать максимальное число?
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Код:
$max_weight=0 ;изначально на весах ноль

While $measurement_in_progress ;пока идет измерение
    If $current_weight > $max_weight Then ;если показания весов больше максимально зарегистрированного веса в предыдущий момент
        $max_weight = $current_weight ;зарегистрировать максимальный вес
    EndIf
WEnd

MsgBox(0, "", $max_weight)
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Код:
$max_weight=0 ;изначально на весах ноль

While $measurement_in_progress ;пока идет измерение
    If $current_weight > $max_weight Then ;если показания весов больше максимально зарегистрированного веса в предыдущий момент
        $max_weight = $current_weight ;зарегистрировать максимальный вес
    EndIf
WEnd

MsgBox(0, "", $max_weight)

Спасибо за совет. Попробую так.

Моя идея такая:
1. Машина заехала.
2. Весы начинают взвешивание. Процесс взвешивания длится некоторое время. В это время значение веса изменяется в большую сторону.
3. Когда значение взвешивания достигает наибольшего значения(через некоторое время), произвести запись в БД.
4. Когда машина съезжает с весов, то значение на весах уменьшается до нуля.
5. Ждём следующую машину.

Часть кода такая. Ничего сложного, но хочу точности в показаниях. Сейчас я, просто, обновляю значение с весов в БД.

Код:
Global Const $senddata = "S00;COF4;MSV?;" ;Команда для опроса весового терминала
While 1 ;Цикл

    _CommSendString($senddata, 1);Отправить запрос в COM порт
    Sleep(1000)
    $Ret_string = _CommGetstring() ; Постоянно опрашиваем порт в цикле
    ;Форматирование полученных данных
    $RepG = StringReplace($Ret_string, "G", "")
    $RepGK = StringReplace($RepG, "K", "")
    $Rep_Res_G = StringReplace($RepGK, " ", "")
    $RepN = StringReplace($Ret_string, "N", "")
    $RepNK = StringReplace($RepN, "K", "")
    $Rep_Res_K = StringReplace($RepNK, " ", "")
    ;-----------------------------------------
    Sleep(1000)
    If Int($Rep_Res_G) OR Int($Rep_Res_K) > 20 Then
        Sleep(500)
        _MySQL()
    EndIf
    If StringInStr($Ret_string, "G", 1) Then
      GUICtrlSetData($meas, Int($Rep_Res_G));Отображение веса в GUI
    EndIF
    If StringInStr($Ret_string, "N", 1) Then
       GUICtrlSetData($meas, Int($Rep_Res_K));Отображение веса в GUI
    EndIf
WEnd
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Моя идея такая:
1. Машина заехала.
2. Весы начинают взвешивание. Процесс взвешивания длится некоторое время. В это время значение веса изменяется в большую сторону.
3. Когда значение взвешивания достигает наибольшего значения(через некоторое время), произвести запись в БД.
4. Когда машина съезжает с весов, то значение на весах уменьшается до нуля.
5. Ждём следующую машину.

Я конечно не эксперт, но разве при остановке транспорта и его старта движения, весы не могут показать вес более чем на самом деле весит транспорт.
Я бы брал несколько последних значений, и когда они между собой более менее совпадают (выставить шаг разницы +/-), тогда считать весы устаканившимися, после чего и брать значение. Так разве не будет более точно, ну если вам точность важна.
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Я конечно не эксперт, но разве при остановке транспорта и его старта движения, весы не могут показать вес более чем на самом деле весит транспорт.
Я бы брал несколько последних значений, и когда они между собой более менее совпадают (выставить шаг разницы +/-), тогда считать весы устаканившимися, после чего и брать значение. Так разве не будет более точно, ну если вам точность важна.
Индикатор весов, к которому я подключаюсь уже настроен на такую ситуацию и сам уравновешивает значение веса. Проблема в том, как понять, что на весах, именно, наибольшее значение (конечный результат взвешивания). Я думал, что нужно дать временную задержку на взвешивание, чтобы быть уверенным в достоверности данных. А после задержки отправлять в БД полученный результат. Пока обдумываю логику. Спасибо за интерес к моей теме.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Могу только предложить получение максимального, минимального и среднего значения в отведенный промежуток времени.
Код:
;время в течении которого искать значения (1000 = 1-й секунде)
$iTime = 5000
;максимальное значение
;эту переменную нужно обнулять перед каждым новым взвешиванием
$iMax = 0
;минимальное значение
;эту переменную нужно выставлять макс. число перед каждым новым взвешиванием
$iMin = 999999
;эту переменную нужно переопределять "TimerInit()" перед каждым новым взвешиванием
$hTimer = TimerInit()
;текущее значение
$iCur = 0

;делитель (для усреднения значения)
;эту переменную нужно обнулять перед каждым новым взвешиванием
$iDivider = 0
;все значения полученные с весов (сумируются)
;эту переменную нужно обнулять перед каждым новым взвешиванием
$iAllValue = 0

While TimerDiff($hTimer) < $iTime
    ;здесь вместо "Random()" должны быть готовые данные/числа считаные с весов
    $iCur = Random(777, 999, 1)
    $iAllValue += $iCur
    $iDivider += 1
    If $iCur > $iMax Then
        $iMax = $iCur
    ElseIf $iCur < $iMin Then
        $iMin = $iCur
    EndIf
    ;задержка в 0.1 сек. чтобы проц. не грузило (можно удалить для точности расчета)
    Sleep(100)
WEnd

MsgBox(0, '', 'В течении '&($iTime/1000)&' сек. определены следующие значения:'&@CRLF&@CRLF&'Максимальное:'&@TAB&$iMax&@CRLF&'Минимальное:'&@TAB&$iMin&@CRLF&'Разница:'&@TAB&@TAB&($iMax-$iMin)&@CRLF&@CRLF&'Среднее 1:'&@TAB&(($iMax+$iMin)/2)&@CRLF&'Среднее 2:'&@TAB&($iAllValue/$iDivider))

И чтобы минимальное не было сильно низким, то есть нулевым, делать измерение после как весы остановили взвешивание.
Т.Е. весы остановили взвешивание, вы получаете в течении заданного времени данные от весов, и из этих данных определяете минимальное и максимальное значение, а дальше каким нибудь образом усредняете значение или оставляете максимальное.
Пока другого ничего в голову не приходит.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
А зачем устанавливать время? можно просто отслеживать повышение или снижение - т.е пока повышается ждать, как только снижается, зафиксировать, и ожидать снова повышение.
На счёт колебания, просто установить что снижением считается на 20 меньше чем максимальное значение.
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Здравствуйте все, кому интересен мой вопрос. Решения, пока, не нашёл, но есть некоторое видение.
Вот, что я думаю.
Во время изменения показаний веса, производить запись этих показаний в массив, для каждой записи своя ячейка. Таким образом не важно, какие данные там будут - во время взвешивания или во время съезда машины с весов. Затем делать выборку максимального значения из массива. Это и должно быть значение веса. После этого записывать значение в БД и обнулять массив для дальнейших данных. Теперь осталось это перевести на язык программирования. Пока не получается. Может у вас есть опыт в таком или подскажите куда смотреть. Спасибо.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Возможно самый большой вес не стоит учитывать , так как во время заезда на платфотму могут быть всякого рода толчки и колебания , которые будут передаваться на весы и максимальный вес не будет соответствовать реальному.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Возможно самый большой вес не стоит учитывать , так как во время заезда на платфотму могут быть всякого рода толчки и колебания , которые будут передаваться на весы и максимальный вес не будет соответствовать реальному.
http://autoit-script.ru/threads/opr...e-izmenjaetsja-v-peremennoj.27290/post-150276
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Возможно самый большой вес не стоит учитывать , так как во время заезда на платфотму могут быть всякого рода толчки и колебания , которые будут передаваться на весы и максимальный вес не будет соответствовать реальному.
Дело в том, что я подключаюсь к весам не прямым подключением, а через цифровой терминал HBM WE2107. В нём все эти возможности учтены. Мне достаточно, только, считывать фактические данные, которые он передаёт.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Массив то Вам зачем , выше IMStrelcov показал вам , как выбирать максимальное значение сходу , его и записывайте в БД.
 
Верх