МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ
УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА»
(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)
Факультет информатики
Кафедра информационных систем и технологий
ОТЧЁТ
к лабораторной работе №1 по курсу
«Интерфейсы АСОИУ»
Выполнили: Алтухов Д.А., гр. 6402
Кривопалов В.Ю., гр. 6402
Маратканов Ю.С., гр. 6402
Проверил: Иоффе В.Г.
Самара, 2011
СОДЕРЖАНИЕ
1 Задание 3
2 Электрическая схема соединения 4
3 Список используемых команд 5
4 Интерфейс пользователя 6
5 Листинг программы с комментариями 8
1 Задание
Вариант 1
Использовать модули I-7021 и I-7044
Сформировать на основе I-7021 экспоненциальное напряжение в рабочем диапазоне модуля. При работе использовать эхоконтроль. Если U ≤ Uдоп. , на выходе модуля I-7044 сформировать потенциал (или импульс, если будет осциллограф).
2 Электрическая схема соединения
Рисунок 1 – Электрическая схема соединения модулей
3 Список используемых команд
Таблица 1 – Используемые общие команды для модулей серии I-7000
Команда |
Ответное сообщение |
Описание |
~AA1 |
!AA |
Произвести сброс статуса модуля |
$AAМ |
!AA(Данные) |
Запросить название модуля |
Таблица 2 – Используемые команды модуля I-7021
Команда |
Ответное сообщение |
Описание |
%AANNTTCCFF |
!АА |
Настроить параметры конфигурации модуля |
$AA2 |
!AANNTTCCFF |
Считать параметры конфигурации модуля |
#AA(Данные) |
> |
Задать значение, устанавливаемое на аналоговом выходе модуля |
$AA7 |
!АА |
Произвести калибровку значения 10 В |
$AA8 |
!AA(Данные) |
Эхоконтроль выхода |
Таблица 3 – Используемые команды модуля I-7044
Команда |
Ответное сообщение |
Описание |
%AANNTTCCFF |
!AA |
Настроить параметры конфигурации модуля |
$AA2 |
!AATTCCFF |
Считать параметры конфигурации модуля |
@AA(Данные) |
> |
Установить дискретные выходы |
@AA |
>(Данные) |
Считать данные с дискретных входов и выходов |
4 Интерфейс пользователя
Рисунок 2 – Начальный вид формы
Рисунок 3 – Вид формы при настроенном виртуальном подключении и настроенных параметрах функции экспоненциального напряжения
Рисунок 4 – Вид формы после расчётов и отрисовки графиков напряжения
5 Листинг программы с комментариями
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WinApp___2011_10_02___InterfaceLab1
{
public partial class Form1 : Form
{
public SerialPort comport = new SerialPort(); //переменная COM-порта
public int openedPortNumber; //номер открытого порта
public int testModuleNumber; //предполагаемый адрес модуля при тестировании адреса
public bool testAdress; //флаг тестирования адреса
public bool specialCommand; //флаг отдельной команды, подаваемой на порт
public bool adr7021correct; //флаг подтверждения нахождения 7021 по указанному адресу
public bool adr7044correct; //флаг подтверждения нахождения 7044 по указанному адресу
public bool recordFuncToHistory; //флаг записи команд, поданных при формировании функции, в историю команд
public bool isInAllowedRange; //флаг нахождения выходного сигнала 7021 в пределах допустимого диапазона
public bool functionFailed; //флаг провала формирования функции
public bool timerEventFired; //флаг достижения таймером установленного значения
public bool graphicsDrawnOnce; //флаг подтверждения необходимости перерисовки графиков при переключении на окно программы
public static double[] dots; //массив точек на графике экспоненциального напряжения
public static int[] impulseAmp; //массив значений, снимаемых с 7044
public string answer; //строка ответа от одного из модулей
public string[] baudRateCodes; //массив строк, содержащих скорости передачи данных при формировании команд настройки модулей
public System.Timers.Timer timerImpulse; //таймер, отсчитывающий длительность импульса 7044
public Form1()
{
InitializeComponent();
comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); //регистрация события получения данных из COM-порта
}
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 1; i <= 256; i++) //установки номеров порта и скоростей передачи на старте программы
{
comboBoxPorts.Items.Add((string)("COM" + i));
}
comboBoxPorts.SelectedIndex = 0;
bool foundDefaultBaud = false;
int j = 0;
while ((j < comboBoxSpeed.Items.Count) && (!foundDefaultBaud))
{
if (comboBoxSpeed.Items[j].ToString() == "9600")
foundDefaultBaud = true;
else j++;
}
if (foundDefaultBaud) comboBoxSpeed.SelectedIndex = j;
else comboBoxSpeed.SelectedIndex = 0;
dots = new double[Convert.ToInt32(numFuncSteps.Maximum)];
impulseAmp = new int[2];
baudRateCodes = new string[8] { "03", "04", "05", "06", "07", "08", "09", "0A" }; //установка кодов скоростей передачи при настройке модулей
timerImpulse = new System.Timers.Timer();
timerImpulse.Elapsed += new System.Timers.ElapsedEventHandler(timerImpulse_Elapsed);
testAdress = false;
specialCommand = false;
adr7021correct = false;
adr7044correct = false;
recordFuncToHistory = false;
graphicsDrawnOnce = false;
radioButtonReal.Enabled = true;
radioButtonFuncRising.Checked = true;
radioButtonFuncHollow.Checked = true;
groupBoxPortSetup.Enabled = false;
buttonClose.Enabled = false;
groupBoxPortCommands.Enabled = false;
groupBox7021.Enabled = false;
groupBox7044.Enabled = false;
groupBoxVirtual7021.Enabled = false;
groupBoxVirtual7044.Enabled = false;
groupBoxFunction.Enabled = false;
groupBoxGraphs.Enabled = false;
buttonBegin.Enabled = false;
}
private void AddHistoryMessage(string msg) //метод добавления строки в панель истории событий программы
{
richTextBoxHistory.Invoke(new EventHandler(delegate
{
richTextBoxHistory.AppendText(msg);
richTextBoxHistory.ScrollToCaret();
}));
}
private void buttonOpen_Click(object sender, EventArgs e)
{
if (comport.IsOpen) AddHistoryMessage("Порт занят. Сперва закройте используемый порт COM" + openedPortNumber + ". \n");
else
{
comport.PortName = comboBoxPorts.SelectedItem.ToString(); //установка параметров COM-порта перед его открытием
openedPortNumber = comboBoxPorts.SelectedIndex;
int baudRate = 9600;
int.TryParse(comboBoxSpeed.SelectedItem.ToString(), out baudRate);
comport.BaudRate = baudRate;
comport.DataBits = 8;
comport.StopBits = StopBits.One;
comport.Parity = Parity.None;
comport.Handshake = Handshake.None;
comport.ReceivedBytesThreshold = 8;
comport.WriteBufferSize = 20;
comport.ReadBufferSize = 20;
comport.ReadTimeout = Convert.ToInt32(numTimeoutRead.Value);
comport.WriteTimeout = Convert.ToInt32(numTimeoutWrite.Value);
comport.DtrEnable = false;
try
{
comport.Open(); //попытка открытия COM-порта
comport.RtsEnable = true;
System.Threading.Thread.Sleep(100);
AddHistoryMessage("Порт " + comboBoxPorts.SelectedItem.ToString() + " открыт. \n");
radioButtonVirtual.Enabled = false;
buttonOpen.Enabled = false;
buttonClose.Enabled = true;
comboBoxPorts.Enabled = false;
comboBoxSpeed.Enabled = false;
numTimeoutRead.Enabled = false;
numTimeoutWrite.Enabled = false;
groupBoxPortCommands.Enabled = true;
groupBox7021.Enabled = true;
groupBox7044.Enabled = true;
groupBoxVirtual7021.Enabled = false;
groupBoxVirtual7044.Enabled = false;
groupBoxFunction.Enabled = true;
}
catch
{
AddHistoryMessage("Порт " + comboBoxPorts.SelectedItem.ToString() + " открыть не удалось. \n");
}
}
}
private void buttonWrite_Click(object sender, EventArgs e)
{
try
{
specialCommand = true; //попытка передачи отдельной команды, сформированной пользователем, в COM-порт
textBoxAnswer.Text = "";
comport.WriteLine(textBoxCommand.Text + (char)0x0D);
AddHistoryMessage("Записана команда: " + textBoxCommand.Text + " \n");
}
catch (TimeoutException)
{
AddHistoryMessage("Превышено время ожидания записи команды " + textBoxCommand.Text + " \n");
specialCommand = false;
}
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) //регистрация события на получение данных COM-портом
{
this.Invoke(new EventHandler(AddRecieve));
}
private void AddRecieve(object s, EventArgs e) //метод, исполняющийся при получении COM-портом данных
{
try
{
System.Threading.Thread.Sleep(100); //ожидание, требуемое для полной записи сообщения от модуля
byte[] dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length);
if (!testAdress) //обработка данных из модуля при вводе отдельной команды пользователем
{
answer = "";
if ((specialCommand) || (recordFuncToHistory)) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if ((specialCommand) || (recordFuncToHistory)) AddHistoryMessage(((char)dataR[i]).ToString());
if (specialCommand)
textBoxAnswer.Text += ((char)dataR[i]).ToString();
answer += ((char)dataR[i]).ToString();
}
if (specialCommand) textBoxAnswer.Text = textBoxAnswer.Text.Remove(textBoxAnswer.Text.Length - 1);
if (answer.Length > 0) answer = answer.Remove(answer.Length - 1);
if ((specialCommand) || (recordFuncToHistory)) AddHistoryMessage(" \n");
}
else //обработка данных из модуля при проверке адреса модуля
{
testAdress = false;
string adressFeedback = "";
for (int i = 0; i < dataR.Length; i++)
{
adressFeedback += ((char)dataR[i]).ToString();
}
adressFeedback = adressFeedback.Remove(adressFeedback.Length - 1);
if (testModuleNumber == 7021)
{
if (adressFeedback == "!" + textBoxAdress7021.Text + "7021")
MessageBox.Show("По адресу " + textBoxAdress7021.Text + " действительно находится модуль 7021");
else MessageBox.Show("Модуль 7021 не найден по адресу " + textBoxAdress7021.Text);
}
else
{
if (adressFeedback == "!" + textBoxAdress7044.Text + "7044")
MessageBox.Show("По адресу " + textBoxAdress7044.Text + " действительно находится модуль 7044");
else MessageBox.Show("Модуль 7044 не найден по адресу " + textBoxAdress7044.Text);
}
}
}
catch (TimeoutException) //сообщения, выдаваемые при превышении времени ожидания ответа от модуля
{
if (testAdress)
{
if (testModuleNumber == 7021)
AddHistoryMessage("Превышено время ожидания ответа с команды !" + textBoxAdress7021.Text + "M \n");
else AddHistoryMessage("Превышено время ожидания ответа с команды !" + textBoxAdress7044.Text + "M \n");
}
else
if (specialCommand) AddHistoryMessage("Превышено время ожидания ответа с команды " + textBoxCommand.Text + " \n");
testAdress = false;
specialCommand = false;
}
comport.DiscardInBuffer();
}
private void buttonClose_Click(object sender, EventArgs e)
{
if (comport.IsOpen) //действия, предпринимаемые при закрытии COM-порта
{
comport.DiscardOutBuffer();
comport.DiscardInBuffer();
comport.Close();
AddHistoryMessage("Порт COM" + openedPortNumber + " закрыт. \n");
buttonOpen.Enabled = true;
buttonClose.Enabled = false;
comboBoxPorts.Enabled = true;
comboBoxSpeed.Enabled = true;
numTimeoutRead.Enabled = true;
numTimeoutWrite.Enabled = true;
groupBoxPortCommands.Enabled = false;
groupBox7021.Enabled = false;
groupBox7044.Enabled = false;
groupBoxFunction.Enabled = false;
radioButtonVirtual.Enabled = true;
}
else
{
AddHistoryMessage("Порт уже закрыт. \n");
}
}
private void buttonTestAdress7021_Click(object sender, EventArgs e) //метод проверки адреса модуля 7021
{
testAdress = true;
testModuleNumber = 7021;
try
{
comport.WriteLine("$" + textBoxAdress7021.Text + "M" + (char)0x0D); //попытка послать команду идентификации модуля по данному адресу
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа от модуля
{
AddHistoryMessage("Превышено время ожидания записи команды " + textBoxCommand.Text + " \n");
testAdress = false;
}
}
private void buttonTestAdress7044_Click(object sender, EventArgs e) //метод проверки адреса модуля 7044
{
testAdress = true;
testModuleNumber = 7044;
try
{
comport.WriteLine("$" + textBoxAdress7044.Text + "M" + (char)0x0D); //попытка послать команду идентификации модуля по данному адресу
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа от модуля
{
AddHistoryMessage("Превышено время ожидания записи команды " + textBoxCommand.Text + " \n");
testAdress = false;
}
}
private void checkBoxVirtual7021_CheckedChanged(object sender, EventArgs e) //метод, определяющий действия при выборе виртуального модуля 7021
{
if (checkBoxVirtual7021.Checked)
{
groupBoxVirtual7021.Enabled = true;
buttonTestAdress7021.Enabled = false;
}
else
{
groupBoxVirtual7021.Enabled = false;
buttonTestAdress7021.Enabled = true;
}
}
private void checkBoxVirtual7044_CheckedChanged(object sender, EventArgs e) //метод, определяющий действия при выборе виртуального модуля 7044
{
if (checkBoxVirtual7044.Checked)
{
groupBoxVirtual7044.Enabled = true;
buttonTestAdress7044.Enabled = false;
}
else
{
groupBoxVirtual7044.Enabled = false;
buttonTestAdress7044.Enabled = true;
}
}
private void radioButtonReal_CheckedChanged(object sender, EventArgs e) //метод, определяющий действия при выборе реального подключения модулей
{
if (radioButtonReal.Checked)
{
groupBoxPortSetup.Enabled = true;
groupBox7021.Enabled = false;
checkBoxVirtual7021.Checked = false;
checkBoxVirtual7021.Enabled = true;
buttonTestAdress7021.Enabled = true;
groupBox7044.Enabled = false;
checkBoxVirtual7044.Checked = false;
checkBoxVirtual7044.Enabled = true;
buttonTestAdress7044.Enabled = true;
groupBoxFunction.Enabled = false;
labelCOMport.Enabled = true;
labelTimeoutWrite.Enabled = true;
labelTimeoutRead.Enabled = true;
buttonOpen.Enabled = true;
comboBoxPorts.Enabled = true;
numTimeoutWrite.Enabled = true;
numTimeoutRead.Enabled = true;
}
}
private void radioButtonVirtual_CheckedChanged(object sender, EventArgs e) //метод, определяющий действия при выборе полностью виртуального подключения модулей
{
if (radioButtonVirtual.Checked)
{
groupBoxPortSetup.Enabled = true;
groupBox7021.Enabled = true;
checkBoxVirtual7021.Checked = true;
checkBoxVirtual7021.Enabled = false;
buttonTestAdress7021.Enabled = false;
groupBox7044.Enabled = true;
checkBoxVirtual7044.Checked = true;
checkBoxVirtual7044.Enabled = false;
buttonTestAdress7044.Enabled = false;
groupBoxFunction.Enabled = true;
labelCOMport.Enabled = false;
labelTimeoutWrite.Enabled = false;
labelTimeoutRead.Enabled = false;
buttonOpen.Enabled = false;
comboBoxPorts.Enabled = false;
numTimeoutWrite.Enabled = false;
numTimeoutRead.Enabled = false;
}
}
private void textBoxAdress7021_TextChanged(object sender, EventArgs e) //метод, анализирующий изменение поля адреса модуля 7021
{
textBoxAdress7021.Text = textBoxAdress7021.Text.ToUpper();
if (textBoxAdress7021.Text.Length == 2)
{
if (((("0123456789ABCDEFabcdef").IndexOf(textBoxAdress7021.Text[0])) != -1) && ((("0123456789ABCDEFabcdef").IndexOf(textBoxAdress7021.Text[1])) != -1))
adr7021correct = true;
else adr7021correct = false;
}
else adr7021correct = false;
if (adr7021correct && adr7044correct && (textBoxAdress7021.Text.ToUpper() != textBoxAdress7044.Text.ToUpper()))
buttonBegin.Enabled = true;
else buttonBegin.Enabled = false;
}
private void textBoxAdress7044_TextChanged(object sender, EventArgs e) //метод, анализирующий изменение поля адреса модуля 7044
{
textBoxAdress7044.Text = textBoxAdress7044.Text.ToUpper();
if (textBoxAdress7044.Text.Length == 2)
{
if (((("0123456789ABCDEFabcdef").IndexOf(textBoxAdress7044.Text[0])) != -1) && ((("0123456789ABCDEFabcdef").IndexOf(textBoxAdress7044.Text[1])) != -1))
adr7044correct = true;
else adr7044correct = false;
}
else adr7044correct = false;
if (adr7021correct && adr7044correct && (textBoxAdress7021.Text.ToUpper() != textBoxAdress7044.Text.ToUpper()))
buttonBegin.Enabled = true;
else buttonBegin.Enabled = false;
}
private void checkBoxFuncToHistory_CheckedChanged(object sender, EventArgs e) //метод, определяющий запись сообщений в историю при формировании экспоненциального напряжения
{
if (checkBoxFuncToHistory.Checked)
recordFuncToHistory = true;
else recordFuncToHistory = false;
}
private void CountFunction(int count, bool risen, bool hollow) //метод, высчитывающий напряжения, небходимые для формирования экспоненциальной функции с заданным числом точек
{
double maxX, maxY, minX, minY;
maxY = 0.99;
maxX = -Math.Log(1 - maxY, Math.E);
minY = 0.01;
minX = -Math.Log(1 - minY, Math.E);
double interval = (maxX - minX) / (count - 1);
int j;
if (risen)
{
if (hollow)
{
for (int i = count - 1; i >= 0; i--)
{
j = count - i - 1;
dots[i] = Math.Round(Math.Exp(-(minX + interval * j)) * 10, 3);
}
}
else
{
for (int i = 0; i < count; i++)
{
dots[i] = Math.Round((1 - Math.Exp(-(minX + interval * i))) * 10, 3);
}
}
}
else
{
if (hollow)
{
for (int i = 0; i < count; i++)
{
dots[i] = Math.Round(Math.Exp(-(minX + interval * i)) * 10, 3);
}
}
else
{
for (int i = count - 1; i >= 0; i--)
{
j = count - i - 1;
dots[i] = Math.Round((1 - Math.Exp(-(minX + interval * j))) * 10, 3);
}
}
}
}
private void DrawGraphics() //метод рисования графиков напряжений модулей 7021 и 7044
{
Graphics g1 = panel7021.CreateGraphics(); //отрисовка графика 7021
g1.Clear(Color.White);
using (g1)
{
using (Pen pen = new Pen(Color.Black, 2f))
{
g1.DrawLine(pen, 15f, 1f, 15f, 151f);
g1.DrawLine(pen, 15f, 151f, 220f, 151f);
}
using (Pen penR = new Pen(Color.Red, 1f))
{
float interval = 200f / (Convert.ToInt32(numFuncSteps.Value) - 1);
for (int i = 1; i < Convert.ToInt32(numFuncSteps.Value); i++)
{
g1.DrawLine(penR, 16f + interval * (i - 1), 151f - (float)(dots[i - 1] / 10 * 150), 16f + interval * i, 151f - (float)(dots[i] / 10 * 150));
}
}
}
Graphics g2 = panel7044.CreateGraphics(); //отрисовка графика 7044
g2.Clear(Color.White);
using (g2)
{
using (Pen pen = new Pen(Color.Black, 2f))
{
g2.DrawLine(pen, 15f, 1f, 15f, 151f);
g2.DrawLine(pen, 15f, 151f, 220f, 151f);
}
Pen penS;
if (isInAllowedRange) penS = new Pen(Color.Green, 1f);
else penS = new Pen(Color.Red, 1f);
using (penS)
{
g2.DrawLine(penS, 15f, 145f, 115f, 145f);
if (isInAllowedRange)
{
float interval = 130f - (float)((255 - Convert.ToDouble(impulseAmp[0])) / 255 * 130);
g2.DrawLine(penS, 115f, 145f, 115f, 145f - interval);
g2.DrawLine(penS, 115f, 145f - interval, 205f, 145f - interval);
float interval2 = 130f - (float)((255 - Convert.ToDouble(impulseAmp[1])) / 255 * 130);
g2.DrawLine(penS, 205f, 145f - interval, 205f, 145f - interval2);
g2.DrawLine(penS, 205f, 145f - interval2, 215f, 145f - interval2);
}
else
{
g2.DrawLine(penS, 115f, 145f, 215f, 145f);
}
}
}
}
private void buttonBegin_Click(object sender, EventArgs e) //метод формирования экспоненциального напряжения
{
groupBoxRadioVirtual.Enabled = false; //предварительная настройка и подсчёты
groupBoxPortSetup.Enabled = false;
groupBoxPortCommands.Enabled = false;
groupBox7021.Enabled = false;
groupBox7044.Enabled = false;
groupBoxFunction.Enabled = false;
CountFunction(Convert.ToInt32(numFuncSteps.Value), radioButtonFuncRising.Checked, radioButtonFuncHollow.Checked);
recordFuncToHistory = checkBoxFuncToHistory.Checked;
isInAllowedRange = true;
functionFailed = false;
if (checkBoxVirtual7021.Checked) //"настройка" виртуального модуля 7021
{
AddHistoryMessage("\nИдёт настройка I-7021 \n\n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: ~" + textBoxAdress7021.Text + "1 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7021.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7021.Text + " \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: %" + textBoxAdress7021.Text + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7021.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7021.Text + " \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7021.Text + "2 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7021.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7021.Text + "7 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7021.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7021.Text + " \n");
AddHistoryMessage("\nНастройка I-7021 прошла успешно \n");
}
else //настройка реального модуля 7021
{
AddHistoryMessage("\nИдёт настройка I-7021 \n\n");
try //попытка сброса статуса модуля 7021
{
comport.WriteLine("~" + textBoxAdress7021.Text + "1" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: ~" + textBoxAdress7021.Text + "1 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды ~" + textBoxAdress7021.Text + "1 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
byte[] dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7021.Text) //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды ~" + textBoxAdress7021.Text + "1 \n");
functionFailed = true;
}
}
if (!functionFailed)
{
try //попытка настройки модуля 7021 на заданные скорость и формат вывода
{
comport.WriteLine("%" + textBoxAdress7021.Text + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: %" + textBoxAdress7021.Text + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды %" + textBoxAdress7021.Text + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7021.Text) //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды %" + textBoxAdress7021.Text + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
functionFailed = true;
}
}
}
if (!functionFailed)
{
try //попытка проверки настроенного режима работы модуля 7021
{
comport.WriteLine("$" + textBoxAdress7021.Text + "2" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7021.Text + "2 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды $" + textBoxAdress7021.Text + "2 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7021.Text + "32" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды $" + textBoxAdress7021.Text + "2 \n");
functionFailed = true;
}
}
}
if (!functionFailed)
{
try //попытка калибровки значения модуля 7021 на 10 В
{
comport.WriteLine("$" + textBoxAdress7021.Text + "7" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7021.Text + "7 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды $" + textBoxAdress7021.Text + "7 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7021.Text) //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды $" + textBoxAdress7021.Text + "7 \n");
functionFailed = true;
}
}
}
if (!functionFailed) AddHistoryMessage("\nНастройка I-7021 прошла успешно \n");
else AddHistoryMessage("\nНастройка I-7021 провалилась \n");
}
if (checkBoxVirtual7044.Checked) //"настройка" виртуального модуля 7044
{
AddHistoryMessage("\nИдёт настройка I-7044 \n\n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: ~" + textBoxAdress7044.Text + "1 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7044.Text + " \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: %" + textBoxAdress7044.Text + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7044.Text + " \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7044.Text + "2 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + "00 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: > \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + " \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: >0000 \n");
AddHistoryMessage("\nНастройка I-7044 прошла успешно \n");
}
else if (!functionFailed) //настройка реального модуля 7044
{
AddHistoryMessage("\nИдёт настройка I-7044 \n");
try //попытка сброса статуса модуля 7044
{
comport.WriteLine("~" + textBoxAdress7044.Text + "1" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: ~" + textBoxAdress7044.Text + "1 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды ~" + textBoxAdress7044.Text + "1 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
byte[] dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7044.Text) //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды ~" + textBoxAdress7044.Text + "1 \n");
functionFailed = true;
}
}
if (!functionFailed)
{
try //попытка настройки модуля 7044 на заданные скорость и формат вывода
{
comport.WriteLine("%" + textBoxAdress7044.Text + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: %" + textBoxAdress7044.Text + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды %" + textBoxAdress7044.Text + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7044.Text) //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды %" + textBoxAdress7044.Text + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00 \n");
functionFailed = true;
}
}
}
if (!functionFailed) //сообщение о превышении времени ожидания ответа
{
try //попытка проверки настроенного режима работы модуля 7044
{
comport.WriteLine("$" + textBoxAdress7021.Text + "2" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7044.Text + "2 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды $" + textBoxAdress7044.Text + "2 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != "!" + textBoxAdress7044.Text + "40" + baudRateCodes[comboBoxSpeed.SelectedIndex] + "00") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды $" + textBoxAdress7044.Text + "2 \n");
functionFailed = true;
}
}
}
if (!functionFailed) //сообщение о превышении времени ожидания ответа
{
try //попытка установки нулевого выходного напряжения на модуле 7044
{
comport.WriteLine("@" + textBoxAdress7044.Text + "00" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + "00 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды @" + textBoxAdress7044.Text + "00 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != ">") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды @" + textBoxAdress7044.Text + "00 \n");
functionFailed = true;
}
}
}
if (!functionFailed) //сообщение о превышении времени ожидания ответа
{
try //попытка проверки нулевого напряжения на модуле 7044
{
comport.WriteLine("@" + textBoxAdress7044.Text + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + " \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды @" + textBoxAdress7044.Text + " \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer.Substring(0, 3) != ">00") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды @" + textBoxAdress7044.Text + " \n");
functionFailed = true;
}
}
}
if (!functionFailed) AddHistoryMessage("\nНастройка I-7044 прошла успешно \n");
else AddHistoryMessage("\nНастройка I-7044 провалилась \n");
}
if (!functionFailed)
{
AddHistoryMessage("\nНачинается формирование экспоненциального напряжения \n\n");
if (checkBoxVirtual7021.Checked) //"формирование" экспоненциального напряжения на виртуальном модуле 7021
{
for (int i = 0; i < Convert.ToInt32(numFuncSteps.Value); i++)
{
if (recordFuncToHistory) AddHistoryMessage("Записана команда: #" + textBoxAdress7021.Text + (String.Format("{0,6:00.000}", dots[i])).Replace(',', '.') + " \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7021.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: > \n");
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7021.Text + "8 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7021.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: !" + textBoxAdress7021.Text + (String.Format("{0,6:00.000}", dots[i])).Replace(',', '.') + " \n");
}
AddHistoryMessage("\nЭкспоненциальное напряжение успешно сформировано \n");
}
else //формирование экспоненциального напряжения на реальном модуле 7021
{
for (int j = 0; j < Convert.ToInt32(numFuncSteps.Value); j++) //для каждой точки графика задаётся отдельное напряжение
{
try //попытка подачи команды о формировании заданного напряжения на модуле 7021
{
comport.WriteLine("#" + textBoxAdress7021.Text + (String.Format("{0,6:00.000}", dots[j])).Replace(',', '.') + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: #" + textBoxAdress7021.Text + (String.Format("{0,6:00.000}", dots[j])).Replace(',', '.') + " \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды #" + textBoxAdress7021.Text + (String.Format("{0,6:00.000}", dots[j])).Replace(',', '.') + " \n");
functionFailed = true;
break;
}
while (comport.BytesToRead < 1)
System.Threading.Thread.Sleep(100); //ожидание формирования в буфере ответного сообщения
byte[] dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != ">") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды #" + textBoxAdress7021.Text + (String.Format("{0,6:00.000}", dots[j])).Replace(',', '.') + " \n");
functionFailed = true;
break;
}
}
try //попытка чтения поставленного на модуле 7021 напряжения с эхоконтролем
{
comport.WriteLine("$" + textBoxAdress7021.Text + "8" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: $" + textBoxAdress7021.Text + "8 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды $" + textBoxAdress7021.Text + "8 \n");
functionFailed = true;
break;
}
while (comport.BytesToRead < 10) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer.Substring(0, 3) == "!" + textBoxAdress7021.Text) //анализ полученного ответа и запись напряжения, снятого с модуля 7021
{
try
{
dots[j] = Convert.ToDouble(answer.Substring(3, 5));
}
catch
{
dots[j] = Convert.ToDouble(answer.Substring(3, 5).Replace('.', ','));
}
if ((dots[j] < 0) || (dots[j] > 10))
{
isInAllowedRange = false;
}
}
else //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды $" + textBoxAdress7021.Text + "8 \n");
functionFailed = true;
break;
}
}
}
if (!functionFailed) AddHistoryMessage("\nЭкспоненциальное напряжение успешно сформировано \n");
else AddHistoryMessage("\nВывод экспоненциального напряжения провален \n");
}
}
if (!functionFailed)
{
if (isInAllowedRange) //если напряжение с модуля 7021 находится в допустимом диапазоне, выполнить следущее:
{
AddHistoryMessage("\nЭкспоненциальное напряжение выводилось в пределах допустимого диапазона, \nначинается формирование импульса на I-7044 \n\n");
if (checkBoxVirtual7044.Checked) //"формирование" импульса заданной длительности на виртуальном модуле 7044
{
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + "FF \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: > \n");
impulseAmp[0] = 255;
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + " \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: >FF00 \n");
timerImpulse.Interval = Convert.ToDouble(numImpulse7044.Value);
timerEventFired = false;
timerImpulse.Start();
while (!timerEventFired) ;
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + "00 \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: > \n");
impulseAmp[1] = 0;
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + " \n");
System.Threading.Thread.Sleep(Convert.ToInt32(numVirtualTimestep7044.Value));
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: >0000 \n");
}
else //формирование импульса заданной длительности на реальном модуле 7044
{
try //попытка формирования максимального напряжения на выводах модуля 7044
{
comport.WriteLine("@" + textBoxAdress7044.Text + "FF" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + "FF \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды @" + textBoxAdress7044.Text + "FF \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
byte[] dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != ">") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды @" + textBoxAdress7044.Text + "FF \n");
functionFailed = true;
}
}
if (!functionFailed)
{
try //попытка чтения напряжения на выводе модуля 7044
{
comport.WriteLine("@" + textBoxAdress7044.Text + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + " \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды @" + textBoxAdress7044.Text + " \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer[0] != '>') //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды @" + textBoxAdress7044.Text + " \n");
functionFailed = true;
}
else
{
impulseAmp[1] = Int32.Parse(answer.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); //запись значения напряжения на выводе модуля 7044
}
}
}
if (!functionFailed)
{
timerImpulse.Interval = Convert.ToDouble(numImpulse7044.Value); //включение таймера, отсчитывающего длительность импульса на модуле 7044
timerEventFired = false;
timerImpulse.Start();
while (!timerEventFired) ; //ожидание достижения таймером заданной длительности
}
if (!functionFailed)
{
try //попытка формирования нулевого напряжения на выводах модуля 7044
{
comport.WriteLine("@" + textBoxAdress7044.Text + "00" + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + "00 \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды @" + textBoxAdress7044.Text + "00 \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer != ">") //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды @" + textBoxAdress7044.Text + "00 \n");
functionFailed = true;
}
}
}
if (!functionFailed)
{
try //попытка чтения напряжения на выводе модуля 7044
{
comport.WriteLine("@" + textBoxAdress7044.Text + (char)0x0D);
if (recordFuncToHistory) AddHistoryMessage("Записана команда: @" + textBoxAdress7044.Text + " \n");
}
catch (TimeoutException) //сообщение о превышении времени ожидания ответа
{
AddHistoryMessage("Превышено время ожидания записи команды @" + textBoxAdress7044.Text + " \n");
functionFailed = true;
}
while (comport.BytesToRead == 0) //ожидание формирования в буфере ответного сообщения
System.Threading.Thread.Sleep(100);
dataR = new byte[comport.BytesToRead];
comport.Read(dataR, 0, dataR.Length); //чтение и анализ ответа
answer = "";
if (recordFuncToHistory) AddHistoryMessage("Получен ответ: ");
for (int i = 0; i < dataR.Length; i++)
{
if (recordFuncToHistory) AddHistoryMessage(((char)dataR[i]).ToString());
answer += ((char)dataR[i]).ToString();
}
answer = answer.Remove(answer.Length - 1);
if (recordFuncToHistory) AddHistoryMessage(" \n");
comport.DiscardInBuffer();
{
if (answer[0] != '>') //сообщение при неверном ответе
{
AddHistoryMessage("Получен неверный ответ при записи команды @" + textBoxAdress7044.Text + " \n");
functionFailed = true;
}
else
{
impulseAmp[1] = Int32.Parse(answer.Substring(1, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
}
}
}
}
if (!functionFailed) AddHistoryMessage("\nФормирование импульса на I-7044 успешно закончено \n");
else AddHistoryMessage("\nФормирование импульса на I-7044 провалено \n");
}
else //если напряжение с модуля 7021 не находится в допустимом диапазоне, выполнить следущее:
{
for (int i = 0; i < impulseAmp.Length; i++) //на выводе модуля 7044 всё время остаётся нулевое напряжение
{
impulseAmp[i] = 0;
}
}
}
if (!functionFailed) //если формирование экспоненциального напряжения прошло без сбоев, ...
{
groupBoxGraphs.Enabled = true; //отрисовать графики напряжений на модулях
graphicsDrawnOnce = true;
DrawGraphics();
}
groupBoxRadioVirtual.Enabled = true; //возобновление возможности работы с компонентами формы
groupBoxPortSetup.Enabled = true;
if (radioButtonReal.Checked)
{
groupBoxPortCommands.Enabled = true;
}
groupBox7021.Enabled = true;
groupBox7044.Enabled = true;
groupBoxFunction.Enabled = true;
}
private void timerImpulse_Elapsed(object sender, EventArgs e)
{
timerEventFired = true; //установка флага достижения таймером установленной длительности
timerImpulse.Stop();
}
private void panel7021_Paint(object sender, PaintEventArgs e) //событие перерисовки графика напряжений модуля 7021 при выводе формы на передний план
{
if (graphicsDrawnOnce) //если графики однажды отрисовывались, ...
DrawGraphics(); //перерисовать графики
}
private void panel7044_Paint(object sender, PaintEventArgs e) //событие перерисовки графика напряжений модуля 7044 при выводе формы на передний план
{
if (graphicsDrawnOnce) //если графики однажды отрисовывались, ...
DrawGraphics(); //перерисовать графики
}
}
}