Форум программистов, компьютерный форум, киберфорум
КИП, датчики
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/48: Рейтинг темы: голосов - 48, средняя оценка - 4.50
80 / 80 / 36
Регистрация: 20.11.2009
Сообщений: 326
1

Получение данных с мультиметра APPA109/305

24.06.2014, 15:00. Просмотров 8758. Ответов 11
Метки нет (Все метки)


Здравствуйте! Мы приобрели измерители фирмы Appa. Если конкретно Appa 109n и Appa 305. Очень сильно интересует опыт форумчан в общении с данными приборами. Если точнее протокол команд для обмена данными с компьютером, к которому подключаются мультиметры. Задача - послать команду и прочитать актуальные данные.

Для начала хотелось бы поговорить только о мультиметре Appa 109n, так как до второго пока не дошли руки.

Удивительно, но японцы из коробки протокол команд не выдали. Зато записали на диск программку, считывающую данные с мультиметра. Протокол был найден на просторах интернета и глаголит:

The RS-232 protocol :
1. Communication Type : RS-232C
2. Communication protocol :
A : Baud Rate : 9600 bps
B : Data length : 8 bits
C : Parity check : None
D : Stop bit : 1 bit
3. Data format : The data format is HEX code.

A. PC sends a command to DMM for requesting to read as follow :

0x55 0x55 0x00 0x00 0xAA


After sending the command, wait for receiving data format from DMM, the time
out setting must be bigger than 450ms.
При этом я прицепился portmon-ом к порту и получил такую картину:
Получение данных с мультиметра APPA109/305



Почесав репу Ничтожась сумняшися я написал вот такой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.Generic;
using System.IO.Ports;
 
namespace appa109
{
    class Program
    {
        //configuration for n109
        static void Config(SerialPort port)
        {
            port.BaudRate = 9600;
            port.StopBits = StopBits.One;
            port.Parity = Parity.None;
            port.DataBits = 8;
            port.Handshake = Handshake.XOnXOff;
           
        }
 
        //start reading command
        static void StartReading(SerialPort port)
        { 
            byte[] command = new byte[5];
         
            command[0] = 0x55;
            command[1] = 0x55;
            command[2] = 0x00;
            command[3] = 0x00;
            command[4] = 0xAA;
 
            port.Write(command, 0, 5);
        }
        /// <summary>
        /// function for reading data from port
        /// </summary>
        /// <param name="port"></param>
        /// <returns> 19 byte of data
        /// 1-st and 2-nd: must be 0x55
        /// 3-rd and 4-th: must be 0x00 and 0x0E
        /// 5-th: rotor code;
        /// 6-th: blue code
        /// 7-th: Key code
        /// 8-th : Range code;
        /// 9-13: Main reading
        /// 14-18: sub reading
        /// 19: check sum
        /// </returns>
        static byte[] Read(SerialPort port)
        {
            byte[] Data = new byte[20];
 
            port.Read(Data, 0, 19);
 
            return Data;
        }
        
        /// <summary>
        /// out data to console
        /// </summary>
        static void ShowResult(byte[] Data)
        {
            foreach (byte b in Data)
            {
                Console.Write(Convert.ToString(b, 16) + " ");
            }
        }
 
 
        static void Main(string[] args)
        {
            SerialPort Port = new SerialPort("COM1");
            Config(Port);
            Port.Open();
            StartReading(Port);
 
            System.Threading.Thread.Sleep(450); //wait for answer value >= 450
 
            Console.WriteLine(Port.ReadExisting());
            byte [] Data = Read(Port);
            ShowResult(Data);
 
            Port.Close();
            Console.ReadLine();
            
        }
    }
}
Однако, результата я не получил. На участке кода port.Read(Data, 0, 19); программа зависает и передо мной предстает окно консоли.
Картинка из portmon:

Получение данных с мультиметра APPA109/305


Внимание вопрос: что я сделал не так и почему ко мне не пришли заветные 19 байт ответа?

Может быть кто-то сталкивался с подобной проблемой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2014, 15:00
Ответы с готовыми решениями:

Неисправность осциллографа-мультиметра С1-112 в режиме "мультиметра"
Здравствуйте. Вот описание неисправности осциллографа которую я уже устранил. Но теперь есть другая...

Работа с menuStrıp
Здорова всем! Помогите новичку с menuStrip. Есть лаб.работы студентов мне нужно собрать их в одном...

osıbka Forma
Здравствуйте всем доброго дня. Пожалуйста, помогите создать форма на базу ms access. Посмотрите...

Выбор мультиметра
Частично сломался мультиметр, который верой и правдой служил где-то с 2003 года. Поэтому встал...

__________________
Помогаю в написании студенческих работ здесь.
11
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
24.06.2014, 23:25 2
1- протоколы и маны скрыты на http://www.appatech.com, там долго возиться, но они там есть. Прилагаю их в посту во вложении
2- "японцы из коробки протокол команд не выдали. Зато записали на диск программку" - это политика партии, но ранее всегда присылали его в ответ на запрос оного на официальный e-mail. Пробовали? Нет.
3- судя по дампу ответ пришел как положено в сниффере, а вот судя по коду вы использовали слипы.

Никогда не используйте слипы для ожидания ответа: во-первых - вы можете начать читать раньше, чем придет ответ, а можете и пропустить, во-вторых - это тормоза приложения. Используйте чтение из потока, мало того, у использованной вами SerialPort обертки есть собственный поток чтения данных, воспользуйтесь справкой к обертке для назначения данного события или MSDN.

Прилагаю также свой тест:
Получение данных с мультиметра APPA109/305
2
Вложения
Тип файла: zip тестовый запросчик-монитор APPA-109.zip (416.1 Кб, 117 просмотров)
Тип файла: pdf Протокол обмена APPA-105n.pdf (70.3 Кб, 72 просмотров)
Тип файла: pdf Протокол обмена APPA-107.pdf (70.3 Кб, 76 просмотров)
Тип файла: pdf Протокол обмена APPA-109N.pdf (96.5 Кб, 107 просмотров)
80 / 80 / 36
Регистрация: 20.11.2009
Сообщений: 326
25.06.2014, 11:35  [ТС] 3
2- "японцы из коробки протокол команд не выдали. Зато записали на диск программку" - это политика партии, но ранее всегда присылали его в ответ на запрос оного на официальный e-mail. Пробовали? Нет.
Большое спасибо за ответ. Вы мне очень помогли. На самом деле запрос японцам я послал в пятницу и что-то пока тишина, видимо, нужно ждать. Еще раз благодарю.

Добавлено через 11 часов 47 минут
raxp, если я Вас правильно понял, то при получении данных я должен руководствоваться: Вот этим вот , я видоизменил код и получил что-то такое:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.IO.Ports;
 
namespace appa109
{
    class Program
    {
        //configuration for n109
        static void Config(SerialPort port)
        {
            port.BaudRate = 9600;
            port.StopBits = StopBits.One;
            port.Parity = Parity.None;
            port.DataBits = 8;
            port.Handshake = Handshake.None;
           
        }
 
        //start reading command
        static void StartReading(SerialPort port)
        { 
            byte[] command = new byte[5];
         
            command[0] = Convert.ToByte(0x55);
            command[1] = Convert.ToByte(0x55);
            command[2] = Convert.ToByte(0x00);
            command[3] = Convert.ToByte(0x00);
            command[4] = Convert.ToByte(0xAA);
 
            port.Write(command, 0, command.Length);
        }
        /// <summary>
        /// function for reading data from port
        /// </summary>
        /// <param name="port"></param>
        /// <returns> 19 byte of data
        /// 1-st and 2-nd: must be 0x55
        /// 3-rd and 4-th: must be 0x00 and 0x0E
        /// 5-th: rotor code;
        /// 6-th: blue code
        /// 7-th: Key code
        /// 8-th : Range code;
        /// 9-13: Main reading
        /// 14-18: sub reading
        /// 19: check sum
        /// </returns>
        static byte[] Read(SerialPort port)
        {
            byte[] Data = new byte[20];
 
            port.Read(Data, 0, 19);
 
            return Data;
        }
        
        /// <summary>
        /// out data to console
        /// </summary>
        static void ShowResult(byte[] Data)
        {
            foreach (byte b in Data)
            {
                Console.Write(Convert.ToString(b, 16) + " ");
            }
        }
 
        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            byte[] indata = Read(sp);
            Console.WriteLine("Data Received:");
            ShowResult(indata);
            Console.ReadLine();
        }
 
        static void Main(string[] args)
        {
            SerialPort Port = new SerialPort("COM1");
            Config(Port);
 
            Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
 
            Port.Open();
            StartReading(Port);
                      
            Port.Close();
            
            
        }
    }
}
Но данные так и не пришли =(
При этом я воспользовался Вашей программой "тестовый запросчик-монитор" и там все прекрасно.
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
25.06.2014, 22:55 4
static void Main(string[] args)
{
SerialPort Port = new SerialPort("COM1");
Config(Port);

Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

Port.Open();
StartReading(Port);

Port.Close();


}
выделил красным проблемный участок у вас. И да, запрос данных желательно сделать периодическим, скажем в таймере.

Добавлено через 2 часа 38 минут

https://www.cyberforum.ru/blog... g2498.html
1
80 / 80 / 36
Регистрация: 20.11.2009
Сообщений: 326
30.06.2014, 16:58  [ТС] 5
выделил красным проблемный участок у вас. И да, запрос данных желательно сделать периодическим, скажем в таймере.
Странно, конечно, но исправил проблемный участок как Вы и сказали - проблема не решилась... Прибор на посылаемую команду никак не реагирует и ничего не присылает... Попробую еще спросить японцев письмом, может быть что-то подскажут...

При этом, Ваши приложения, raxp, работают.
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
30.06.2014, 19:46 6
...фух. Ну подключите мою библиотеку к своему проекту, она все сделает сама. У вас событие DataReceivedHandler не срабатывает.

но исправил проблемный участок
как именно исправили, показывайте, чудес не бывает.
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
27.12.2014, 14:50 7
...потроха APPA-109

(не мое)
0
0 / 0 / 0
Регистрация: 10.08.2015
Сообщений: 1
12.08.2015, 09:16 8
Извиняюсь, что поднимаю старую тему, но она очень юзабельная до сих пор, хочу отметить, что в протоколе на устройства 100-й серии ошибка и команда запроса должна быть не такая:
0x55 0x55 0x00 0x00 0xAA

а такая:
0x55 0x55 0x80 0x00 0x2A

Проверял на appa 107N и 109N
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
12.08.2015, 16:01 9
APPA107, 109 - это старые модификации. С буквой N новые, логично что производитель решил "поизвращаться" и чуть изменить протокол. В теме модификации N не обсуждаются.

Если у вас есть новый протокол, выложите его в новой теме.
0
80 / 80 / 36
Регистрация: 20.11.2009
Сообщений: 326
13.10.2015, 23:47  [ТС] 10
Поскольку тему прикрепили, я выложу код на который ответил мультиметр тем чем должен был ответить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.IO.Ports;
 
namespace appa109
{
    class Program
    {
        static SerialPort sp;
        static List<byte> sBuffer = new List<byte>();
        static void Main(string[] args)
        {
            sp = new SerialPort
            {
                PortName = "COM1",
                BaudRate = 9600,
                DataBits = 8,
                Parity = Parity.None,
                StopBits = StopBits.One,
                Handshake = Handshake.XOnXOff,
                RtsEnable = true
                
            };
            sp.Open();
            
            byte[] inData = { 0x55, 0x55, 0x00, 0x00, 0xaa };
            sp.Write(inData, 0, inData.Length);
 
            Read();
 
        }
 
        ~Program()
        {
            if (sp != null && sp.IsOpen)
            {
                sp.Close();
            }
        }
 
        static void Read()
        {
            bool boolRead = true;
            while (boolRead)
            {
                try
                {
                    sBuffer.Add((byte)sp.BaseStream.ReadByte());
                    if (sp.BytesToRead == 0)
                        if (sBuffer.Count != 0)
                            Readed();
                }
                catch (TimeoutException)
                {
                    Console.WriteLine("Timeout");
                }
            }
        }
 
        private static void Readed()
        {
            Console.WriteLine(BitConverter.ToString(sBuffer.ToArray()));
            sBuffer.Clear();
        }
    }
}
Важно правильно ввести настройки:

C#
1
2
3
4
5
6
7
8
9
sp = new SerialPort
            {
                PortName = "COM1",
                BaudRate = 9600,
                DataBits = 8,
                Parity = Parity.None,
                StopBits = StopBits.One,
                Handshake = Handshake.XOnXOff,
                RtsEnable = true
1
42 / 2 / 0
Регистрация: 11.04.2015
Сообщений: 20
28.10.2015, 15:27 11
Большое спасибо за протоколы обмена! Очень помогли вчера.
Вот желающим пример моей программы для списывания показаний с APPA109N. Показания списываются 2 раза в секунду, сохраняются в файл специфического формата и раз в 5 секунд добавляются на график.
Программа с исходниками.
0
Вложения
Тип файла: rar IPumpControl.rar (180.9 Кб, 77 просмотров)
0 / 0 / 0
Регистрация: 13.01.2021
Сообщений: 4
14.01.2021, 14:55 12
Здравствуйте! Подскажите пожалуйста, возникла проблема. Нам для работы требуется написать свою программу для APPA 109 N на Lab View. Подключаем данный мультиметр к ПК через Moxa NPort 5150. Запрос 0x55 0x55 0x00 0x00 0xAA отсылается (видно, в том числе, по индикации на Moxa), однако ответ не приходит. Прилагаю скрин кода. Что делаю не так? В Lab View пока что полный чайник.
0
Миниатюры
Получение данных с мультиметра APPA109/305  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2021, 14:55

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

Выбор мультиметра
Всем привет! Помогите, пожалуйста, выбрать цифровой мультиметр. Чтобы была обязательно прозвонка...

Выбор мультиметра
Около 10 лет пользовался Mastech-MY68. В принципе он и сейчас работает, но точность потерял и...

Дисплей от мультиметра
Доброго дня! Досталась мне от электриков плата от мультиметра UNI-T UT53, хотел поиметь с него...

Ремонт мультиметра
Запамятовал переключать на AC мультиметр при замере вольтажа в розетке, и в итоге сгорел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.