Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Стандартні коди помилок



01 – Прийнятий код функції не може бути опрацьований.

02 – Адреса даних, вказана у запиті, недоступна даному Slave.

03 – Значення, що міститься в полі даних запиту, є неприпустимою для Slave.

04 – Мала місце невідновлювана помилка, поки Slave намагався сформувати пакет-відповідь.

05 – Slave прийняв запит і опрацьовує його, але це вимагає багато часу. Ця відповідь оберігає Master від генерації помилки тайм-ауту.

06 – Slave зайнятий опрацюванням іншої команди. Master повинен повторити повідомлення пізніше, коли Slave звільниться.

07 – Slave не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, який використовує функції з номерами 13 або 14. Master повинен запросити діагностичну інформацію або інформацію про помилки від Slave.

08 – Slave намагається читати розширену пам'ять, але виявив помилку паритету. Master може повторити запит, але звичайно в таких випадках потрібно проводити діагностику обладнання та ремонт.

Обчислення контрольної суми CRC16. Контрольна сума CRC16 обчислюють з використанням всіх байтів пакету даних DATA за таким алгоритмом:

1. Присвоїти змінній CRC, яка є типу __int16 (шістнадцяти бітне число) значення 0xFFFF.

2. Виконати з першим байтом DATA0 пакету даних таку операцію: CRC = CRC XOR DATA0 (додавання за модулем 2).

3. Зсунути CRC на один біт вправо.

4. Якщо вихідний біт (той що вийшов за межі числа CRC) дорівнює 1, виконати таку операцію: CRC = CRC XOR 0xA001. Якщо вихідний біт дорівнює 0, нічого не робити.

5. Виконати 8 разів пункти 3, 4 (з усіма бітами молодшого байту числа CRC, до якого було додано за модулем 2 байт DATA0).

6. Виконати з усіма наступними байтами (DATA1, DATA2 і т.д.) пакету даних пункти 2, 3, 4, 5

 

Отримане значення контрольної суми CRC16 додається в кінці пакету даних у такому порядку: спочатку молодший, а потім старший байти (на відміну від інших даних, що містяться в пакеті, який сформовано за протоколом Modbus – спочатку старший, а потім молодший байти).

 

Алгоритм обміну даними представлено на рисунку:

Алгоритм обміну даними для приладу та комп’ютера

 

Код програми прийому-передачі приладу:

 

#include <vcl.h>

#include "comm.h"

#pragma hdrstop

 

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

TCommPort *Serial1;

 

 

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

 

 

Serial1=new TCommPort;

Serial1->OpenCommPort("COM1");

Serial1->SetBaudRate(CBR_9600);

Serial1->SetStopBits(ONESTOPBIT);

 

 

}

 

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

k=0;

Timer1->Enabled=true;

 

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

if(Serial1->BytesAvailable()>=1)

{

paket[k]=Serial1->GetByte();

 

Memo1->Lines->Add(IntToStr(paket[k]));

k++;

if (k>=6)

{

Timer1 ->Enabled=false;

Timer2->Enabled=true;

}

 

 

}

 

else

Memo1->Lines->Add("Nema Danuh ");

 

 

}

//---------------------------------------------------------------------------

 

 

void __fastcall TForm1::Timer2Timer(TObject *Sender)

{

Timer2->Enabled=false;

for (i=0; i<6; i++)

Memo2->Lines->Add(IntToStr(paket[i]));

if (paket[0]==10) Timer3->Enabled=true;

else ShowMessage ("pomylka adresy");

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Timer3Timer(TObject *Sender)

{

Serial1->PutByte(paket[0]);

}

//---------------------------------------------------------------------------

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.