Bascom в Си (АВР и модбас)

Раздел начинающих пользователей
Правила форума
В песочнице можно спрашивать когда незнаешь где спросить.
В песочнице нелзя посылать в гугл
В песочнице можно задавать любой вопрос, но на него могут и неответить.
Песочница для тех, кто начинает свои вопросы с защиты чайников от пинков.
В песочницу будут перетаскиваться вопросы неполучившие ответа.
Песочница - попытка навести порядок.
На песочницу большие надежды.

Bascom в Си (АВР и модбас)

Сообщение Evgen4623874632rhwe (Женя) » 25 апр 2020, 17:12

Привет всем. Можете ПОЖАЛУЙСТА перевести программу из среды 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
Аватар пользователя
Ник: Evgen4623874632rhwe
Имя: Женя
(Удмуртская Республик)
Новичок
Новичок
Информация о пользователе

Re: Bascom в Си (АВР и модбас)

Сообщение Yushik (Андрей) » 26 апр 2020, 07:36

Здравствуйте а что вам мешает сделать этот алгоритм в ФК-5.5.2.1 авр например. Я бегло просмотрел вроде ничего сложного нет. Посмотрите примеры на форуме, также необходимо в папке с установленной ФК заменить файлы для исправления глюков и багов а также они добавят дополнительные прерывания, здесь viewtopic.php?f=15&t=2387 и здесь viewtopic.php?f=15&t=3349&start=10. Пример рассчёта CRC-16 modbus rtu я когда-то давал здесь viewtopic.php?f=15&t=3947 , может ещё где то есть. К то му же ФК файл на СИ сгенерирует автоматически, маловероятно что кто-то на форуме здесь знает Bascom, к то-му же за вас никто работу выполнять не будет но подсказать направить помогут.
Аватар пользователя
Ник: Yushik
Имя: Андрей
(Симферополь)
Супер разработчик
Супер разработчик
Информация о пользователе


Вернуться в ПЕСОЧНИЦА

Кто сейчас на форуме

Пользователь просматривает форум: Google [Bot]