Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: Как последовательно считывать параметр PV с ТРМ201?

  1. #1

    Question Как последовательно считывать параметр PV с ТРМ201?

    Собственно сабж.

    Если просто считывать вот так:
    Код:
    adr:=StrToInt(ebAdr.Text);
    chitaen_nazvanie:=ReadFloat24(adr,0,'PV',val,-1);
    Label4.Caption:=FloatToStr(val);
    то всё в порядке - параметр считывается

    Пытался считать вот так вот:
    Код:
    adr:=StrToInt(ebAdr.Text);
    for i:=1 to 18 do
      begin
        chitaen_nazvanie:=ReadFloat24(adr,0,'PV',val,-1);
        sleep(300);
        Label4.Caption:=FloatToStr(val);
    end;
    не работает. RS мигает на приборе и показывает последнее значение. Мне нужно как-то считывать эти значения, чтобы добавлять их в таблицу и/или отображать их на графике. Не знаю как это сделать, есть у кого какие идеи?

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    т.е. в цикле Вы считываете со всех приборов значения и заносите в одну лабель и не понимаете почему в ней отображается значение последнего прибора?

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    т.е. в цикле Вы считываете со всех приборов значения и заносите в одну лабель и не понимаете почему в ней отображается значение последнего прибора?
    Честно говоря да, т. к. в моём понятии значение должно отобразится, а потом следующее и т.д... Лучше в StringGrid выводить? Или как решить данную проблему?

    И как сделать, чтобы постоянно значение читалось, это без цикла как-то можно организовать или нет? Или через While? Например, While порт открыт читать значение PV. Так будет лучше?
    Последний раз редактировалось iKarma; 03.12.2012 в 14:23.

  4. #4

    По умолчанию

    Цитата Сообщение от iKarma Посмотреть сообщение
    Честно говоря да, т. к. в моём понятии значение должно отобразится, а потом следующее и т.д... Лучше в StringGrid выводить? Или как решить данную проблему?

    И как сделать, чтобы постоянно значение читалось, это без цикла как-то можно организовать или нет? Или через While? Например, While порт открыт читать значение PV. Так будет лучше?
    Попробовал сделать так, но неудача:
    Код:
    while 1=1  do 
      begin
        chitaen_nazvanie:=ReadFloat24(adr,0,'PV',val,-1);
        sleep(300);
        Label4.Caption:=FloatToStr(val);
      end;
    Прога виснет и не отвечает, и ничего не выводит. Как справиться с этой проблемой? Помогите пожалуйста, очень жду помощи

  5. #5

    По умолчанию

    Цитата Сообщение от iKarma Посмотреть сообщение
    Попробовал сделать так, но неудача:
    Код:
    while 1=1  do 
      begin
        chitaen_nazvanie:=ReadFloat24(adr,0,'PV',val,-1);
        sleep(300);
        Label4.Caption:=FloatToStr(val);
      end;
    Прога виснет и не отвечает, и ничего не выводит. Как справиться с этой проблемой? Помогите пожалуйста, очень жду помощи
    Попробовал сделать чтобы значения выводились в StringGrid, но выводятся нули. Вот код:
    Код:
     with strngrd1 do
          begin
            Cells[i, 1]:=FloatToStr(ReadFloat24(adr,0,'PV',val,-1));
            Sleep(1000);
          end;
    Подскажите пожалуйста, как это возможно сделать. Ведь по-любому кто-то этой задачей занимался. Очень жду помощи!!!

  6. #6

    По умолчанию

    Разобрался со своим батхёртом. Всё работает. Прост я никак не могу привыкнуть к формату вывода данных через функцию. А надо вот так:
    Код:
    with strngrd1 do
          begin
            chitaen_nazvanie:=ReadFloat24(adr,0,'PV',val,-1);
            Cells[i, 1]:=FloatToStr(val);
            //Sleep(1000); //не обязательно
          end;

  7. #7
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    import java.net.*
    import java.sql.*
    import java.io.*
    import java.util.*
    import net.wimpi.modbus.net.*
    import net.wimpi.modbus.io.*
    import net.wimpi.modbus.msg.*
    import net.wimpi.modbus.util.*
    import net.wimpi.modbus.procimg.*

    arr = new SimpleRegister[2];
    def toFloat(Register smal,Register larg) {
    byte[] regis = new byte[4];
    if (smal instanceof SimpleRegister) {
    regis[3] = larg.toBytes()[0]
    regis[2] = larg.toBytes()[1]
    regis[1] = smal.toBytes()[0]
    regis[0] = smal.toBytes()[1]
    return ""+ModbusUtil.registersToFloat(regis)
    } else if(smal == null) {
    regis[0] = 0
    regis[1] = 0
    regis[2] = larg.toBytes()[0]
    regis[3] = larg.toBytes()[1]
    return ""+ModbusUtil.registersToInt(regis)
    }
    }
    def myDOset(ModbusTCPTransaction tr) {
    z = 2050+Integer.parseInt(""+Math.round(10*Math.random ()))
    print "w: "+ z
    sr = new SimpleRegister(z);
    // SimpleRegister[] sr = arr;
    rgs = new WriteMultipleRegistersRequest(2,sr)
    rgs.setUnitID(2)
    tr.setRequest(rgs)
    try {
    tr.execute()
    } catch(Exception e) {println e}
    }
    def myDOs(ModbusTCPTransaction tr) {
    sreg = new BitVector(15)
    (0..14).each{i -> sreg.setBit(i,(Math.round(Math.random())>0?true:fa lse))}
    println sreg.size() + " " + sreg.byteSize()
    // arr[0] = new SimpleRegister(16914);
    // arr[1] = new SimpleRegister(26214);
    // SimpleRegister[] sreg = arr;
    rgs = new WriteMultipleCoilsRequest(0,sreg)
    rgs.setUnitID(1)
    tr.setRequest(rgs)
    try {
    tr.execute()
    } catch(Exception e) {println e}
    }
    def myDIs(ModbusTCPTransaction tr) {
    rgs = new ReadCoilsRequest(0,13)
    rgs.setUnitID(1)
    tr.setRequest(rgs)
    try {
    tr.execute()
    ban = ((ReadCoilsResponse) tr.getResponse()).getCoils()
    ban.forceSize(13);
    println ban.toString()
    } catch(Exception e) {println e}
    }
    def myDIreq(ModbusTCPTransaction tr) {
    igs = new ReadMultipleRegistersRequest(0,4)
    // igs = new ReadInputRegistersRequest(2,1)
    igs.setUnitID(1)
    tr.setRequest(igs)
    try {
    tr.execute()
    ban = (((ReadMultipleRegistersResponse) tr.getResponse()).getRegisters())
    // ban = (((ReadInputRegistersResponse) tr.getResponse()).getRegisters())
    } catch(Exception e) {println e; System.exit(0)}
    // println toFloat(ban[0],ban[1])
    // arr[0] = ban[0]
    // arr[1] = ban[1]
    // println " r: "+toFloat(null,ban[0]) + " "
    println toFloat(null,ban[1]) +" "+toFloat(null,ban[0])
    //4 println toFloat(null,ban[1]) +" "+toFloat(null,ban[0])+" "+toFloat(null,ban[3])+" "+toFloat(null,ban[2])
    //6 println toFloat(null,ban[0]) +" "+toFloat(null,ban[1])+" "+toFloat(null,ban[2])+" "+toFloat(null,ban[3])+" "+toFloat(null,ban[4])+" "+toFloat(null,ban[5])
    //8 println toFloat(null,ban[0]) +" "+toFloat(null,ban[1])+" "+toFloat(null,ban[2])+" "+toFloat(null,ban[3])+" "+toFloat(null,ban[4])+" "+toFloat(null,ban[5])+" "+toFloat(null,ban[6])+" "+toFloat(null,ban[7])
    }
    def myConnect() {
    con = new TCPMasterConnection(InetAddress.getByName("10.0.6. 88"))
    con.setPort(502)
    con.connect()
    do_trans = new ModbusTCPTransaction(con)
    cal = new GregorianCalendar()
    while(true) {
    // cal.setTime(new java.util.Date())
    // if (cal.get(Calendar.SECOND)%5 == 0) {
    // myDOs(do_trans)
    // myDOset(do_trans)
    // try{Thread.sleep(100)}catch(Exception e){}
    myDIreq(do_trans)
    // myDIs(do_trans)
    // try{Thread.sleep(100)}catch(Exception e){}
    // }
    try{Thread.sleep(900)}catch(Exception e){}
    }
    con.close()
    }
    tScript = new Thread(new Runnable() {
    public void run() {
    myConnect()
    }
    });
    tScript.start();
    у меня ни каких проблем не возникает, правда это не Ваш язык и код для тестов, так что много лишнего

  8. #8

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    у меня ни каких проблем не возникает, правда это не Ваш язык и код для тестов, так что много лишнего
    У меня всё таки проблема в постоянном считывании переменной. Один раз прочитать и вывести на экран - это не сложно, а вот её считывать не представляю как. Вы знаете как это сделать? Нужно-ли использовать потоки? В одном потоке читать значение переменной, а в другом выводить её на экран. Так?

    З.Ы.: ваш код скорее не до конца понял, но вы читаете через бесконечный while, так?

  9. #9
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    да, читаю в бесконечном, может не так быстро, но для человека вполне хватит обновления раз в секунду, поток не обязательны, вроде мелочевка а не прграмма

  10. #10

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    да, читаю в бесконечном, может не так быстро, но для человека вполне хватит обновления раз в секунду, поток не обязательны, вроде мелочевка а не прграмма
    У меня при бесконечном цикле программа напрочь виснет и никакой результат на экран не выдаёт...

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 06.12.2011, 08:18
  2. ТРМ101 как считать параметр r-S по RS-485
    от Friencis в разделе Помощь Разработчикам
    Ответов: 7
    Последнее сообщение: 20.12.2010, 22:22
  3. Считывать\посылать посылки через порт rs232
    от Максим_Фалалеев в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 08.10.2008, 19:09
  4. ТРМ 33 параметр Р5
    от незарегистрированный в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 30.06.2008, 11:52
  5. на что влияет параметр n.FLt у ТРМ1387
    от незарегистрированный в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 20.12.2007, 23:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •