Git Product home page Git Product logo

modbus's People

Contributors

foxclever avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

modbus's Issues

例程

能否再提供一个rtu主机的例程呢?
主站中的从站的初始化。

mbascii.c的问题

mbascii.c 文件里
1、生成读写从站的命令的函数的第62行,和下面的生成应答主站的响应函数对应,应该是commandBytes[index++] = AsciiCommand[i];
2、生成读写从站的命令函数和生成应答主站的响应函数里AsciiCommand[256]数组的定义是不是要改成AsciiCommand[512],我查数据看到好像Modbus ASCII 帧的最大尺寸为 513 个字符。

小bug

你好!
在dataobject.c文件里的RegisterNode *GenerateRegisterObjectStorageStructure(DataObject dataObject)函数好像有问题。
line145:RegisterNode node={i,0,0,NULL};是否应该改为:RegisterNode node={dataObject.startingAddress+i,0,0,NULL};
这样就可以和 StatusNode *GenerateStatusObjectStorageStructure(DataObject dataObject)函数对应起来,并且在
uint16_t GetRegisterObjectValue(RegisterObject robject,uint8_t result[],DataObject dataObject)函数里的line:281的node->index>=dataObject.startingAddress才能成立。

mbtcp.c

uint16_t SyntheticServerAccessRespond(uint8_t *receivedMessage,bool *statusList,uint16_t *registerList,uint8_t *respondBytes) 中的

uint16_t bytesCount=GenerateMasterAccessRespond(receivedMessage+6,statusList,registerList,respondBytes);

应该改为
uint16_t bytesCount=GenerateMasterAccessRespond(receivedMessage+6,statusList,registerList,respond);

可能的bug

SetRegisterObjectValue函数中index一次只加1,但是判断条件是index<dataObject.quantity*2,是不是有点问题啊。
还有一些中文错别字方面的错误以及slave写成salve(不知道是不是想写成slave)。
哥们,给点模拟的例程,方便调试

mbtcpclient.c

/生成预置服务器对象的命令,功能码0x05,0x0F,命令长度随发送数据而变/
if((objInfo.functionCode==WriteSingleCoil)&&(objInfo.functionCode==WriteMultipleCoil))
{
bool statusList=(bool)dataList;
commandLength=SyntheticReadWriteTCPServerCommand(objInfo,statusList,NULL,commandBytes);
}

/生成预置服务器对象的命令,功能码0x06,0x10,命令长度随发送数据而变/
if((objInfo.functionCode==WriteSingleRegister)&&(objInfo.functionCode==WriteMultipleRegister))
{
uint16_t registerList=(uint16_t)dataList;
commandLength=SyntheticReadWriteTCPServerCommand(objInfo,NULL,registerList,commandBytes);
}

是不是应该改为:

/生成预置服务器对象的命令,功能码0x05,0x0F,命令长度随发送数据而变/
if((objInfo.functionCode==WriteSingleCoil)||(objInfo.functionCode==WriteMultipleCoil))
{
bool statusList=(bool)dataList;
commandLength=SyntheticReadWriteTCPServerCommand(objInfo,statusList,NULL,commandBytes);
}

/生成预置服务器对象的命令,功能码0x06,0x10,命令长度随发送数据而变/
if((objInfo.functionCode==WriteSingleRegister)||(objInfo.functionCode==WriteMultipleRegister))
{
uint16_t registerList=(uint16_t)dataList;
commandLength=SyntheticReadWriteTCPServerCommand(objInfo,NULL,registerList,commandBytes);
}

使用说明

可以提供移植说明么,比如串口 和定时器 该怎么移植 或者提供一些例子

疑问

mbasciimaster.c 文件:
问题:78行if判断里的17是怎么来的。
详细描述:ParsingAsciiSlaveRespondMessage()函数里的78行的
if((rxLength<17)||(recievedMessage[rxLength-2] !=0x0D)||(recievedMessage[rxLength-1]!=0x0A))
里的17是怎么的出来的,如果不算数据帧,应该只需要9个字节才对啊
1个起始字符,2个地址字符,2个功能字符,2个LCR检验字符,2个结束字符

有关tcp 发送消息的问题

我是个C语言初学者有个问题不明白想求教一下不胜感激
tcp socket send 发送16进制数组时会出现种种问题
比如
int cmdInt[]= {0x05,0x03,0x00,0x00,0x00,0x03,0x04,0x7c}
有 00 会出现字符不全只包含数组前两个即 0x05 和 0x03 可能00对应asii码 null的原因吧修改之后还是无法全部发送
0x04 对应 asii 码的发送结束于是只能发送{0x05,0x03,0x00,0x00,0x00,0x03}

所有代码如下 想知道实际应用中是怎么发送这样的指令的
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>
#include <pthread.h>

int listener_d;
void handler_shutdown(int sig);
int catch_signal(int sig, void (*handler)(int sig));
void error(char *msg);
int open_listener_socket();
void bind_to_port(int socket, int port);
int say(int socket, void s, int len);
int read_in(int socket, char buf, int len);
void
keep_read_write(void
connect_d);
FILE *f;
char dict[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
void hex2str(uint16_t *input, char *output, int len){
int loop,j;
loop = 0;
j = 0;
while(loop < len)
{
output[j] = dict[input[loop] >> 4];
output[j+1] = dict[input[loop] & 0x0f];
loop +=1;
j+= 2;
}
output[j++] = '\0';
}

void string2hexString(char* input, char* output, int len)
{
int loop;
int i;
i=0;
loop=0;
while(loop < len)
{
sprintf((char*)(output+i),"%02X", input[loop]);
loop+=1;
i+=2;
}
//insert NULL at the end of the output string
output[i++] = '\0';
}

int main(void){
f = fopen("stories.txt", "w");
if (!f) {
error("Can't open stories.txt");
}
if(catch_signal(SIGINT, handler_shutdown) == -1){
error("Can't set the intrruot handler");
}
listener_d = open_listener_socket();
bind_to_port(listener_d,8158);
if(listen(listener_d, 10) == -1){
error("Can't listen");
}

struct sockaddr_storage client_addr;
unsigned int address_size = sizeof(client_addr);
puts("waiting for connection");
pthread_t threadList[4];
int currentSize = 0;
while(1){
	int connect_d = accept(listener_d, (struct sockaddr *) &client_addr, &address_size);
	if(connect_d == -1){
		error("can't open second socket");
	}
	if(currentSize < 4){
		if(pthread_create(&threadList[currentSize],NULL, keep_read_write, (void*)connect_d) == -1){
			puts("555");
			error("can't create thread");
		}
		currentSize++;
	}
	sleep(1);
}

void *result;
int i = 0;
pthread_t pt;
while(threadList[i]){
		pt = threadList[i];
		i++;
		pthread_join(pt,&result);
}
return 0;

}

void* keep_read_write(void *param){
char buf[255];
uint16_t cmdInt[]= {0x05,0x03,0x00,0x00,0x00,0x03,0x04,0x7c};
int command_len = sizeof(cmdInt) / sizeof(uint16_t);
int connect_d = (int)param;
while(1){
char output[255];
hex2str(cmdInt, output,command_len);
printf("send cmd %s\n",output);
printf("command len is %d \n",command_len);
fprintf(f,"output %s\n",output);
say(connect_d, (void *)cmdInt, command_len);
sleep(1);
read_in(connect_d, buf, 255);
sleep(5);
}
}

int read_in(int socket, char *buf, int len){
char *s = buf;
int slen = 8;
int c = recv(socket, s, slen, 0);
printf("received data is %s lllllll and len %d and slen %d\n",s, c, slen);
if (c < 0){
return c;
}else if(c == 0){
buf[0] = '\0';
}else{
buf[c] = '\0';
}

char output[255];
string2hexString(buf, output, slen);
fprintf(f,"input %s\n",output);
printf("received data is %s \n",output);

return len -slen;

}

void bind_to_port(int socket,int port){
struct sockaddr_in name;
name.sin_family = PF_INET;
//uint16_t hostshort
name.sin_port = (in_port_t) htons(port);
name.sin_addr.s_addr = htonl(INADDR_ANY);
int reuse = 1;
if(setsockopt(socket, SOL_SOCKET, SO_REUSEADDR,(char *)&reuse, sizeof(int)) == -1){
error("Can't set the reuse option on the socket");
}
int c = bind(socket, (struct sockaddr *) &name, sizeof(name));
if(c == -1){
error("can't bind to socket");
}
}

int say(int socket, void *s, int len){
//memcpy(buf,recvbuf);
//write(socket, s, len);
send(socket, s, len, 0);
//puts("bbbb");
return 0;
}

int open_listener_socket(){
int s = socket(PF_INET,SOCK_STREAM, 0);
if(s == -1){
error("Can't open socket");
}

return s;

}

void error(char *msg){
fprintf(stderr," error happen %s", msg);
exit(0);
}

int catch_signal(int sig, void(*handler)(int)){
struct sigaction action;
action.sa_handler = handler;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
return sigaction(sig, &action, NULL);
}

void handler_shutdown(int sig){
if(listener_d){
close(listener_d);
}

fprintf(stderr,"Bye!\n");
exit(0);

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.