Перейти к содержанию

Evgeny Baimurzin

Members
  • Постов

    1
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Челябинск

Электроника

  • Стаж в электронике
    1-2 года
  • Сфера радиоэлектроники
    Электротехника и Электроника

Достижения Evgeny Baimurzin

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Привет всем. Можете ПОЖАЛУЙСТА перевести программу из среды Bascom в язык Си Основная задача программы: требуется вывести напряжение снимаемое с АЦП микроконтроллера mega8 в скада систему. Работа АВР с скада осуществляется по протоколу MODBUS-RTU. Все уже сделано. Только очень нужно на языке Си. Вот собственно и программа на баском: ИНИЦИАЛИЗАЦИЯ, ПЕРЕМЕННЫЕ $lib "modbus.lbx" ' Библиотека modbus содержит функцию подсчета контрольной суммы crcMB $Regfile="m8def.dat" $Crystal=8000000 $hwstack=40 $swstack=16 $framesize=32 $baud = 9600 'скорость UART Config Portd.3 = Output 'разрешение на передачу по 485 Enable_tx Alias Portd.3 'в микросхеме MAX485 переключает направление прием-передача Open "comb.3:9600,8,n,1" For Output As #1 'Софтварный USART Open "comb.4:9600,8,n,1" For Input As #2 'Используется для отладки Config Pind.1 = Output 'Аппаратный USART Config Pind.0 = Input 'Для связи с ОПЦ сервером Echo Off Config Adc = Single , Prescaler = 128 , Reference = Avcc 'Конфигурируем АЦП Config Pinc.0 = Input Config Pinc.1 = Input Config Pinc.2 = Input Config Pinc.3 = Input Config Pinc.4 = Input Config Pinc.5 = Input Start Adc Dim Inbuf(10) As Byte 'Буфер приема данных по протоколу MODBUS Dim OutBuf(100) As Byte 'Буфер для передачи данных по протоколу MODBUS Dim CRC As Word 'CRC Dim Offset As Word 'Сдвиг Dim i As Byte Dim j As Byte Dim S As String * 100 Dim Fst As Byte Dim ByteCount As Byte Enable Interrupts Dim Inputs(9) As Word 'Входы ПЛК Const Modbus_slave = 1 'Адрес SLAVE устройства задаем "1" Const InputsCount = 9 'Количество Входов Const InAdrr = 512 'Стартовый адресс для входов ОСНОВНОЙ КОД for i=1 to InputsCount Inputs(i)=i Next Do Inputs(1) = Getadc(1) If Ischarwaiting() = 1 Then 'проверка наличия команды в буфере UART $timeout = 1000 'Таймаут чтения Inputbin Inbuf(1) 'Читаем буфер s="OPC>" For i = 1 To 8 'преобразуем в текст и отправляем в порт отладки s=s+Hex(Inbuf(i)) 'преобразуем в текст и отправляем в порт отладки Next 'преобразуем в текст и отправляем в порт отладки Offset = Makeint(Inbuf(7) , Inbuf(8)) 'Загоняем принятую CRC в переменную типа "слово" If Offset <> Crcmb(Inbuf(1) , 6) Then 'Проверка CRC (контрольной суммы) s=s+" CRC ERR" Else s=s+" CRC OK" EndIf Print #1 , s 'преобразуем в текст и отправляем в порт отладки if Inbuf(1)=Modbus_slave then 'если адрес совпадает с нашим if Inbuf(2)=3 then 'если приняли комманду на чтение - 3 Offset=Makeint(Inbuf(4) , Inbuf(3)) 'Читаем запрашиваемый адрес ByteCount=Inbuf(6) 'Читаем длинну комманды Fst=Offset-InAdrr 'Вычисляем с какого номера элемента из массива запрашивается чтение if Offset >= InAdrr And Fst < InputsCount then Fst=Fst+1 ByteCount=Inbuf(6)+Fst 'Количество переменных для чтения ByteCount=ByteCount-1 OutBuf(1)=Modbus_slave 'Формирыем ответ 1-Адресс OutBuf(2)=3 'Функция OutBuf(3)=Inbuf(6)*2 'Размер пакета j=3 'Положение текущего элемента в буфере for i=Fst to ByteCount 'Складываем в буфер j=j+1 OutBuf(j)=High(Inputs(i)) j=j+1 OutBuf(j)=Low(Inputs(i)) 'Print #1 , Inputs(i) Next CRC = Crcmb(OutBuf(1) , j) 'создаем CRC (контрольную сумму) j=j+1 OutBuf(j) = Low(CRC) 'передаем CRC в буфер MODBUS j=j+1 OutBuf(j) = High(CRC) Printbin OutBuf(1) ; j 'Отправляем буфер в канал связи s="PLC>" For i = 1 To j s=s+Hex(OutBuf(i)) Next Print #1 , s endif endif s="" endif Loop Return
×
×
  • Создать...