Профиль должен быть заполнен на русском языке кириллицей. Заполнение профиля заведомо ложными или некорректными данными - причина возможного отказа в регистрации на форуме.

Обмен данными между I8000 и модулями I7000 серии

PLC, прочие контроллеры, промышленные компьютеры, операторские панели

Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 07:24
Ф.И.О.: Вечканов Александр Михайлович
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV » 14 мар 2016, 06:10

Здравствуйте уважаемые Эксперты.

Хотелось бы обсудить тему связи между контроллерами и удалёнными модулями ввода/вывода ICP DAS, по COM порту 2 или 3.
но никак не получается организовать связь между контроллером I8811 и удалёнными модулями сбора информации I70хх серии.

Необходимо получить данные от модуля I7017C ,на контроллере,или произвести управляющее воздействие с контроллера на модуль I7061D
Сами модули настроены через DCON_Utility:
I7017C-скорость 9600, адрес 01, остальные настройки заводские... на Ai_0 подключён имитатор токового сигнала;
I7061D-скорость 9600, адрес 07, остальные настройки заводские;
Подключены к COM 3 контроллера.

Непосредственно сама тех программа для контроллера разрабатывается на базе MiniOS7.
Следуя из предоставленных примеров на диске, которые кстати совсем не рабочие, изшерстив львиную часть интернета, перепробовал много вариантов, но организовать обмен так и не получилось. :affliction:

Вот один из примеров для управляющего воздействия на модуль I7061D:

Код: Выделить всё

#include <icpdas.h>
#include "Lib\8000E.H"
     
void main()     
{
InitLib();
InstallCom(3, 9600, 8, 0, 0);

SendCmdTo7000(3,"#070001",0);
   
RestoreCom(3); 
}


прошу вас помочь разобраться с обменом данных между контроллером I8811 и модулями i70xx и по возможности привести небольшой работоспособный пример.

Заранее благодарен, всем отозвавшимся.

Исходные коды программ следует оформлять тегом code
VADR

Аватара пользователя

Никита
почётный участник форума
почётный участник форума
Сообщения: 2494
Зарегистрирован: 20 янв 2010, 22:23
Ф.И.О.: Никита
Откуда: Мурманск
Благодарил (а): 2 раза
Поблагодарили: 13 раз
Контактная информация:

Обмен данными между I8000 и модулями I7000 серии

Сообщение Никита » 14 мар 2016, 11:24

А если без всяких контроллеров из терминала послать - работает?
Насколько помню, при "ручном" опросе из самописной программы еще перевод строки нужно добавлять.
Вообще, надо доки на функции из библиотек смотреть - может SendCmd и сама его добавляет. И с контрольной суммой тоже разобраться. Я их уже лет десять не трогал, вспоминать надо.
Ну и в контроллере, ес-но, скомпилированный exe-шник запустить надо.
Опыт - это когда на смену вопросам: "Что? Где? Когда? Как? Почему?" приходит единственный вопрос: "Нахрена? "

Аватара пользователя

vodav
осмотрелся
осмотрелся
Сообщения: 132
Зарегистрирован: 28 авг 2014, 08:30
Ф.И.О.: Воднев Александр Васильевич
Благодарил (а): 5 раз
Поблагодарили: 5 раз

Обмен данными между I8000 и модулями I7000 серии

Сообщение vodav » 14 мар 2016, 13:45

Код: Выделить всё

Declaration:
int InstallCom(int port, unsigned long baud, int data, int parity, [color=#FF0000]int stop[/color]);
Input Parameter:
Argument What it does
port 1/2/3/4 for COM 1/2/3/4
baud Baudrate, 1200,2400,.... 57600,115200
data Data bits. 6 or 7 or 8(6 only for COM1/2)
parity Parity bit. 0=None, 1=EVEN, 2=ODD,3=MARK,4=SPACE(3,4 only for COM1/2)
[color=#FF0000]stop Stop bit. 1= 1 stop-bit, 2=2 stop-bit(2 only for COM1/2) [/color]

А у Вас это значение равно 0. Проверьте еще раз параметры связи.

Фрагменты кода следует окружать тэгом CODE (кнопка есть), иначе может сработать автозамена и вместо скобки будет смайлик.
Админ.


Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 07:24
Ф.И.О.: Вечканов Александр Михайлович
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV » 15 мар 2016, 03:14

Спасибо парни, что отозвались!!!
Я тоже давно не брался за программирование, но жизнь диктует свои порядки...

В общем разобрался, всё таки запустил демо примеры с диска ICPDAS, просто изначально споткнулся на небольшой мелочи, для модуля I7061D ошибся в максимальном количестве сигналов (выставлял 8 а их 12), а модуль I7017C пытался протащить через COM 2, а там нужно отдельно подключать AddCom2Fun();..., а потом полез в дебри и как обычно бывает не в том направлении...
Ща примеры кину, может кто спасибо скажет. примера два в первом взаимодействие контроллера с модулем I7061D по Com 3, во втором связь контроллера с модулем I7017C по Com 2.

напоминаю ещё раз начальные константы:
контроллер I8811.
Com 2 контроллера - модуль I7017C-скорость 9600, адрес 01, остальные настройки заводские... на Ai_0 подключён имитатор токового сигнала;
Com 3 контроллера - модуль I7061D-скорость 9600, адрес 07, остальные настройки заводские;


Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 07:24
Ф.И.О.: Вечканов Александр Михайлович
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV » 15 мар 2016, 03:23

взаимодействие контроллера с модулем I7061D по Com 3
(что бы понять какое число Hex переведётся в бит маску используйте инженерный канкулятор, к примеру при посылке числа 3 у вас замкнётся первые два канала)
кода 100% рабочий, уже обкатал, если не идёт проверти переменные связи InstallCom и Write7K87K_DO

Код: Выделить всё

#include <icpdas.h> 
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
               
#include "Lib\8000E.H"

int Write7K87K_DO(int iComPort,int iAddress,int TotalChannel,int iCheckSum,int iTimeout,unsigned long lValue);

void main()
{
    int iRet,iChannel;   
    unsigned char cTemp[10];
    unsigned long lDOdata;   
 
    InitLib(); 
    InstallCom(3,9600,8,0,1);

while(!quit)
    {
        Print("Please Input DO Data(Hex) = ");
        LineInput(cTemp,10);
        sscanf(cTemp,"%8lX",&lDOdata);
       
        iRet=Write7K87K_DO(3,7,12,0,100,lDOdata);
    }
    RestoreCom(3);
}

int Write7K87K_DO(int iComPort,int iAddress,int iTotalChannel,int iCheckSum,int iTimeout,unsigned long lValue)
{
    int iRet,i;
    unsigned char OutBuf[20],InBuf[20];
    unsigned long iMask=0,x;
   
    for(i=0;i<iTotalChannel;i++)       //Distinguish from channel number
    {
        x=1UL << i;
        iMask|=x;                 
    }
   
    if(iTotalChannel <= 8)
    {
        sprintf(OutBuf,"@%02X%02X",iAddress,(lValue & iMask));
    }
    else if(iTotalChannel <= 16 && iTotalChannel > 8)
    {
        sprintf(OutBuf,"@%02X%04X",iAddress,(lValue & iMask)); 
    }
    else
    {
        sprintf(OutBuf,"@%02X%08lX",iAddress,(lValue & iMask));
    }
   
    SendCmdTo7000(iComPort,OutBuf,iCheckSum);
    iRet=ReceiveResponseFrom7000_ms(iComPort,InBuf,iTimeout,iCheckSum);   
   
    if(iRet==NoError)
    {
        if(InBuf[0] =='>')      //Valid response first character: >
        {
            return NoError;
        }
        else
           return -1;  //Response string error.
    }
    else
        return iRet;
}


Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 07:24
Ф.И.О.: Вечканов Александр Михайлович
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV » 15 мар 2016, 03:31

связь контроллера I8811 с модулем I7017C по Com 2
опять же код точно работает, если не идёт, проверти настройки модуля через через DCON_Utility, а также проверти переменные связи проверти переменные связи InstallCom и Read7K87K_AI

Код: Выделить всё

#include <icpdas.h> 
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
               
#include "Lib\8000E.H"

int Read7K87K_AI(int iComPort,int iAddress,int iChannel,int iCheckSum,int iTimeout,float *fValue);                           

void main()
{
    int iRet,iChannel;   
    float fValue;
    int quit=0;
         
    InitLib();   
    AddCom2Fun();
 
    InstallCom(2,9600,8,0,1);

while(!quit)
    {
    for(iChannel=0;iChannel<=7;iChannel++)
      {
        iRet=Read7K87K_AI(2,5,iChannel,0,100,&fValue);
        if(fValue<-20){fValue=0;} //что бы отрицательные значения не проскакивали при обрывах
        Print("Ch%d=%6.3f\n\r",iChannel,fValue);       
        if(fValue>=16){quit=1;break;}  //что бы останавливать прокрутку тех программы 
      }     
    Delay(1000);
    }
   
    RestoreCom(2);
}

//Engineer Unit Format
int Read7K87K_AI(int iComPort,int iAddress,int iChannel,int iCheckSum,int iTimeout,float *fValue)
{
 unsigned char OutBuf[20],InBuf[20];
 int iRet;

    sprintf(OutBuf,"#%02X%01X",iAddress,iChannel);
    iRet=SendCmdTo7000(iComPort,OutBuf,iCheckSum);
    iRet=ReceiveResponseFrom7000_ms(iComPort,InBuf,iTimeout,iCheckSum);   
   
    if(iRet==NoError)
     { if(InBuf[0]== '>')      //Valid response first character: >
        {
            *fValue=atof(InBuf+1);
            return NoError;   
        }
        else
            return -1;          //Response string error.
    }
    else
        return iRet;   
}

Аватара пользователя

vodav
осмотрелся
осмотрелся
Сообщения: 132
Зарегистрирован: 28 авг 2014, 08:30
Ф.И.О.: Воднев Александр Васильевич
Благодарил (а): 5 раз
Поблагодарили: 5 раз

Обмен данными между I8000 и модулями I7000 серии

Сообщение vodav » 15 мар 2016, 04:54

vodav писал(а):Источник цитаты Фрагменты кода следует окружать тэгом CODE (кнопка есть), иначе может сработать автозамена и вместо скобки будет смайлик.
Админ.

Админу: Где Вы увидели код в моем сообщении? Мне кажется, что это всего лишь текстовое описание функции. К тому же вы снесли цветовое выделение критического места и сообщение потеряло изначальный смысл и всякую логику.


Вернуться в «Средний уровень автоматизации»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей